IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Строки, извлечение числа из сроки
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской

Репутация: -  0  +


Добрый день!!! Помогите пожалуйста решить такую задачу:
Допустим дана такая строка (13121123123-123123123). Как извлечь из нее число до первого знака опереции (*,-,/,+) b и поместить его в другую строку.
Конечно если знать что посли числа идет знак - то можно ипользовать эту реализацию.
function QWERTY(s : string):string;
var
  i,p : byte;
  sum : string;
begin
  sum :='';
  p := pos('-',s);
  for i :=1 to p-1 do
    sum := sum + s[i];
  QWERTY := sum;
end;
begin
Writeln(Qwerty('100528749-300'));
end.
.
А если я не знаю, какой знак операции идет после числа. Как поступать в такой ситуации?????!!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


Не используй pos, иди по строке посимвольно:

 i:=1; 
while s[i] in ['0'..'9'] do begin
sum:=sum+s[i]; inc(i);
end; 
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской

Репутация: -  0  +


Malice, спасибо!!!Разобрался....Осталасась последняя ошибка..Она помойму связана с неправильным переводом числа (из стринг в реал).

Вот код программы. Проблемное место показано комментарием....Помогите пожалуйста. Мне во вторник нужно сдавать эту задачу!!!!!! (это калькулятор на базе польской записи);

 
const
max=1000;
type
 STACK = record
		  top:integer;
		  elem:array [1..max] of char;
		 end;

 STACK2 = record
		  top:integer;
		  elem:array [1..max] of real;
		 end;



 var
 s,s2:stack;
 symv:char;
 {---------------------------------------}
   procedure MakeNull (var S:STACK);
	   begin
		 S.top:=max + 1;
	   end;
{---------------------------------------}
	procedure MakeNullR (var S:STACK2);
	   begin
		 S.top:=max + 1;
	   end;

{---------------------------------------}
   function Empty (S:Stack):boolean;
	   begin
		if S.top > max then
		   Empty:=true
		else
		   Empty:=false;
	   end;
{----------------------------------------}
   function Top(s : stack) : char;
  begin
	if Empty(s) then exit
  else
	  Top := s.elem[s.top];
  end;
{---------------------------------------}
   procedure OutStack (var s:stack; var symv:char);
	  begin
		if Empty (s) then exit
	   else
		begin
		 symv:= s.elem[s.top];
		 s.top:=S.top + 1;
		end;
	  end;
{--------------------------------------}
  procedure OutStackR (var s:stack2; var x:real);
	  begin
		if Empty (s2) then exit
	   else
		begin
		 x:= s.elem[s.top];
		 s.top:=S.top + 1;
		end;
	  end;
{---------------------------------------}
	 procedure Instack (var S:Stack;x:char);
	  begin
		if S.top = 1 then exit
	   else
			begin
			 s.top:=s.top-1;
			 s.elem[s.top]:=x;
			end;
	   end;

{---------------------------------------}
  procedure InstackR (var S:Stack2;x:real);
	  begin
		if S.top = 1 then exit
	   else
			begin
			 s.top:=s.top-1;
			 s.elem[s.top]:=x;
			end;
	   end;
{----------------------------------------}
   function Prior(f : char) : Byte;
begin
	case f of
	   '+','-' : prior := 2;
	   '*','/' : prior := 3;
	   '(' , ')' : prior := 1;
		else
	 prior := 0;
	end;
end;

{----------------------------------------}
 procedure Dell(var s : stack);
begin
	if Empty(s) then exit
	else
	  s.top := s.top + 1;
end;
{----------------------------------------}
  procedure opz (var out:string);
	var
	 i: integer; inp:string;
	 t: boolean; out2:string;
	  begin
	   Makenull(s);
		 write ('INP = ');
		  readln (inp);
		for i:=1 to length (inp) do
		  case inp[i] of
		   '0'..'9': begin
					  if (inp[i]>='0') and (inp[i]<='9') then
						out:=out+inp[i];
						 end;

	'+','-','*','/': begin
					   out:=out+' ';
						while Prior(Top(s))>= Prior(inp[i]) do
						   begin
							outstack(s,symv);
							out:=out+symv+' ';
						   end;
							instack (s,inp[i]);
						  end;


	   '(' : InStack(s,inp[i]);

			')' : begin
					  while Prior(Top(s)) <> 1 do
						 begin
							 OutStack(s,symv);
							 out:=out+' '+symv;
						 end;
					  Dell(s);
				  end;
		end;
	 for i:=max downto s.top do
			out:=out+' '+s.elem[i];

				writeln ('OPZ = ',out);

			  end;
{-----------------------------------------------------}
 procedure Result (out:string;var res:real);
  var
   error:integer;
   num,x,y:real;
   s3:stack2;
   estr:string;
   i:integer;

	begin
	 MakeNullR(s3);
	  for i := 1 to Length(out) do
	   case out[i] of
		 '0'..'9' : begin
				  if (out[i]>='0') and (out[i]<='9') then
					 begin
					  out:=out+out[i];
					  val(out,num,error);
					  InstackR(s3,num);	{<--- TUTA GEMOROY}
					end;
				   end;

			  ' ': begin estr:=estr+out[i]; end;
			  '+': begin
					 OutStackR(s3,y);
					 OutStackR(s3,x);
					 res:=x+y;
				   end;
			  end;
   writeln('mass:');

	 for i:=max downto s3.top do
	  writeln(s3.elem[i]);

   writeln('----------');
  writeln('RES = ',res);
	writeln('----------');
  end;



  var
   outp,inp:string; res:real;
	begin
	 OPZ (outp);
	  Result(outp,res);


	  readln;
	 end.



Сообщение отредактировано: volvo -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Maximka, ты опять неверно пытаешься делать... Смотри внимательно:
  for i := 1 to Length(out) do
    case out[i] of
      '0'..'9' : begin
        if (out[i]>='0') and (out[i]<='9') then begin
          out:=out+out[i];
          val(out,num,error);
          InstackR(s3,num); { <--- Здесь ! }
        end;
      end;
  ...

Если строка будет '123+234', сколько чисел у тебя будут занесены в стек? У тебя заносятся ЦИФРЫ! А это не нужно, надо занести именно числа... Я тебе уже говорил об этом. Кстати, зачем новую тему создал? Это же продолжение твоей предыдущей темы про "Польскую запись"...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской

Репутация: -  0  +


ЗА новую тему извиняюсь...Старую можно сносить.... unsure.gif

volvo, что у меня не получается..Не могли бы вы исправить ошибку...
Когда вводишь 1032+123123 в стек попадает только первое число, причем 8 раз
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской

Репутация: -  0  +


Я считываю строку до первого пробела и заношу результат в другую строку(out).В этой строке находятся только цифры, соответственно всю строку можно перевести в целое число (real),что я и делаю.В переменной num хранится число, я его переношу в стек S3. И так далее... Я никак не пойму почему в стек попадает несколько раз, только первое число?..Мне очень нужна ваша помощь...Помогите пожалуйста. Это последняя задача, которую мне осталось сдать...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 24
Пол: Мужской

Репутация: -  0  +


Вот подобная программа, только попроще - там только сложение и вычитание.
Зато все работает. good.gif


Прикрепленные файлы
Прикрепленный файл  NO_152.rar ( 390 байт ) Кол-во скачиваний: 203
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской

Репутация: -  0  +


Цитата(Bill Gates @ 11.06.2006 21:05) *

Вот подобная программа, только попроще - там только сложение и вычитание.
Зато все работает. good.gif


За вариант спасибо!!, но очень хочется доделать свою..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской

Репутация: -  0  +


Вроде исправил...Но один баг остался...Выражения вида (235674234-2565677) считаются на ура. А стоит ввести (235674234-2565677)-234. Результат почемуто неправильный. Помогите ПОЖАЛУЙСТА!!!!!!!!!


const
max=1000;
type
 STACK = record
          top:integer;
          elem:array [1..max] of char;
         end;

 STACK2 = record
          top:integer;
          elem:array [1..max] of real;
         end;



 var
 s,s2:stack;
 symv:char;
 {---------------------------------------}
   procedure MakeNull (var S:STACK);
       begin
         S.top:=max + 1;
       end;
{---------------------------------------}
    procedure MakeNullR (var S:STACK2);
       begin
         S.top:=max + 1;
       end;

{---------------------------------------}
   function Empty (S:Stack):boolean;
       begin
        if S.top > max then
           Empty:=true
        else
           Empty:=false;
       end;
{----------------------------------------}
   function Top(s : stack) : char;
  begin
    if Empty(s) then exit
  else
      Top := s.elem[s.top];
  end;
{---------------------------------------}
   procedure OutStack (var s:stack; var symv:char);
      begin
        if Empty (s) then exit
       else
        begin
         symv:= s.elem[s.top];
         s.top:=S.top + 1;
        end;
      end;
{--------------------------------------}
  procedure OutStackR (var s:stack2; var x:real);
      begin
        if Empty (s2) then exit
       else
        begin
         x:= s.elem[s.top];
         s.top:=S.top + 1;
        end;
      end;
{---------------------------------------}
     procedure Instack (var S:Stack;x:char);
      begin
        if S.top = 1 then exit
       else
            begin
             s.top:=s.top-1;
             s.elem[s.top]:=x;
            end ;
       end;

{---------------------------------------}
  procedure InstackR (var S:Stack2;x:real);
      begin
        if S.top = 1 then exit
       else
            begin
             s.top:=s.top-1;
             s.elem[s.top]:=x;
            end ;
       end;
{----------------------------------------}
   function Prior(f : char) : Byte;
begin
    case f of
       '+','-' : prior := 2;
       '*','/' : prior := 3;
       '(' , ')' : prior := 1;
        else
     prior := 0;
    end;
end;

{----------------------------------------}
 procedure Dell(var s : stack);
begin
    if Empty(s) then exit
    else
      s.top := s.top + 1;
end;
{----------------------------------------}
  procedure opz (var out:string);
    var
     i: integer; inp:string;
     t: boolean; out2:string;
      begin
       Makenull(s);
         write ('INP = ');
          readln (inp);
        for i:=1 to length (inp) do
          case inp[i] of
           '0'..'9': begin
                      if (inp[i]>='0') and (inp[i]<='9') then
                        out:=out+inp[i];
                         end;

    '+','-','*','/': begin
                       out:=out+' ';
                        while Prior(Top(s))>= Prior(inp[i]) do
                           begin
                            outstack(s,symv);
                            out:=out+symv+' ';
                           end;
                            instack (s,inp[i]);
                          end;


       '(' : InStack(s,inp[i]);

            ')' : begin
                      while Prior(Top(s)) <> 1 do
                         begin
                             OutStack(s,symv);
                             out:=out+' '+symv;
                         end;
                      Dell(s);
                  end;
        end;
     for i:=max downto s.top do
            out:=out+' '+s.elem[i];

                writeln ('OPZ = ',out);

              end;
{-----------------------------------------------------}
 procedure Result (out:string ;var res:real);
  var
   error:integer;
   num,x,y:real;
   s3:stack2;
   estr,out2:string;
   i:integer;

    begin
     MakeNullR(s3);
      for i := 1 to Length(out) do
       case out[i] of
         '0'..'9' : begin
                  if (out[i]>='0') and (out[i]<='9') then
                     begin
                      out2:=out2+out[i];
                       end;
                     end;

              ' ': begin
                         val(out2,num,error);
                         InstackR(s3,num);
                         out2:='';
                   end;
              '+': begin
                     OutStackR(s3,y);
                     OutStackR(s3,x);
                     res:=x+y;
                     InStackR(s3,res);
                   end;
              '-': begin
                     OutStackR(s3,y);
                     OutStackR(s3,x);
                     res:=x-y;
                     InStackR(s3,res);
                   end;
              '*': begin
                     OutStackR(s3,y);
                     OutStackR(s3,x);
                     res:=x*y;
                     InStackR(s3,res);
                   end;
              '/': begin
                     OutStackR(s3,y);
                     OutStackR(s3,x);
                     res:=x/y;
                     InStackR(s3,res);
                   end;




              end;
   writeln('mass:');

     for i:=max downto s3.top do
      writeln(s3.elem[i]);

   writeln('----------');
  writeln('RES = ',res);
    writeln('----------');
  end;



  var
   outp,inp:string; res:real;
    begin
     OPZ (outp);
      Result(outp,res);


      readln;
     end.


Сообщение отредактировано: volvo -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской

Репутация: -  0  +


HELLLLLLLP!!!!!!!!!!!!!!!!!!!!! Мне задачу завтра сдавать!!!!! Очень хочется продолжать учиться!!!!! mega_chok.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


Чего кричишь? Сам виноват. smile.gif Ошибки то простые:
В процедуре Result ты при встрече в строке пробела пытаешься засунуть в стек число. Это было бы логично, если бы пробелы стояли только после чисел, а ты их лепишь и после знаков и после скобок. Всязи с этим проще всего заменить блок в case out[i]
         '0'..'9' : begin
                  if (out[i]>='0') and (out[i]<='9') then 
                    begin 
                       out2:=out2+out[i];
                    end;
          end;

на
'0'..'9' : begin out2:='';
 while (out[i] in ['0'..'9']) and (i<length(out)) do begin
  out2:=out2+out[i]; inc(i);
   end; val(out2,num,error);   dec(i);
     InstackR(s3,num);
 end;

Немного не корректно, но пойдет.
ps: case с пробелом убрать вообще.

Сообщение отредактировано: volvo -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской

Репутация: -  0  +


Malice, спасибо что откликнулся - добрая душа!!!! Но я уже сам все исправил..Если кому надо то кину исходники... good.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 16.04.2025 1:15
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name