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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.11.2010, 20:41   #1
Nikita++
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 80
Злость Delphi

Приветъ! Задача такова: в строке 2 числа, необходимо их найти и присвоить переменным.


Примеры:

[23,-65)
23 -65,где a=23,c=-65

[-2546056,0]
-2546056 0, где a=-2546056,c=0

Такая расстановка соблюдается всегда. Цифры и знаки всегда в тех же местах.

Я пытался, но у меня не проходит на тесте с нулями и c=-x, да и длинная что-то очень:

Код:
program Project4;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
   s:string;
   a,c,b,i,g,v,n:integer;
begin
   readln(s);
   g:=1;
   i:=2;
   a:=0;
   v:=0;
   c:=0;
   repeat
        if (s[i] in ['0'..'9']) then
        while (s[g] in ['0'..'9']) do
         begin
            b:=strtoint(s[g]);
            a:=(a*10)+b;
            inc(g);
            inc(v);
         end;
      i:=i+v;
      g:=i;
      v:=1;
   until (a>0);
   if (s[2]='-') then a:=a*(-1);
   repeat
        if (s[i] in ['0'..'9']) then
        begin
        n:=g;
        while (s[g] in ['0'..'9']) do
         begin
              b:=strtoint(s[g]);
              c:=(c*10)+b;
              inc(g);
              inc(v);
         end;
        end;
      i:=i+v;
      v:=1;
   until (c>0);
   if (s[n-1]='-') then c:=c*(-1);
   write(a,' ',c);
   readln;
end
Nikita++ вне форума Ответить с цитированием
Старый 09.11.2010, 22:02   #2
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Вот это подойдёт:
Код:
program Project1;

{$APPTYPE CONSOLE}

var
  a,c :Integer;
  Err  :Integer;
  B,M,E :Integer; // начало, середина конец
  S,Buf :string; // входная строка, буффер значений
begin
 Write('Vvedite stroku: ');
 Readln(S);
 Writeln;
  //
 B := Pos('[', S);
 M := Pos(',', S);
 E := Pos(']', S);
  // корректна ли строка
 if (B = 0)or(M = 0)or(E = 0) then
 begin
  Writeln(' Ne hvataet znakov v stroke!');
  Readln;
  Exit;
 end;  
 if not ((B < M)and(M < E)and(E < B)) then
 begin
  Writeln(' Znaki v stroke raspolozheni ne verno!');
  Readln;
  Exit;
 end;
  // значение A
 Buf := Copy(S, B + 1, M - (B+1));
 Val(Buf, a, Err);
 if Err <> 0 then
 begin
  Writeln('Oshibka konvertacii znacheniya A = ', Buf);
  ReadLn;
  Exit;
 end;
  // значение C
 Buf := Copy(S, M + 1, E - (M+1));
 Val(Buf, C, Err);
 if Err <> 0 then
 begin
  Writeln('Oshibka konvertacii znacheniya C = ', Buf);
  ReadLn;
  Exit;
 end;
  // выведем значения
 WriteLn('A = ', A);
 WriteLn('C =', C); 
 Readln;
end.
если в обычном Pascal нужно, то уберите это {$APPTYPE CONSOLE}

Последний раз редактировалось Alter; 09.11.2010 в 22:15.
Alter вне форума Ответить с цитированием
Старый 09.11.2010, 22:38   #3
Nikita++
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 80
По умолчанию

А можно как-нибудь без ошибок конвертации? Задачу-то сервер принимать будет
Nikita++ вне форума Ответить с цитированием
Старый 09.11.2010, 23:17   #4
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

То есть надо просто вывести через пробел полученные значения. Без всех проверок.
Так?
Код:
program Project1;

{$APPTYPE CONSOLE}

var
  a,c :Integer;
  Err  :Integer;
  B,M,E :Integer; // начало, середина конец
  S,Buf :string; // входная строка, буффер значений
begin
 Write('Vvedite stroku: ');
 Readln(S);
 Writeln;
  // границы разделителей
 B := Pos('[', S);
 M := Pos(',', S);
 E := Pos(']', S);
  // значение A
 Buf := Copy(S, B + 1, M - (B+1));
 Val(Buf, a, Err);
  // значение C
 Buf := Copy(S, M + 1, E - (M+1));
 Val(Buf, C, Err);
  // выведем значения
 WriteLn(A, ' ', C);
 Readln;
end.
Alter вне форума Ответить с цитированием
Старый 09.11.2010, 23:20   #5
Nikita++
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 80
По умолчанию

Спасибо за уделенное время, но я тут уже кое-что смоделировал:

Код:
program Project4;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
   s:string;
   a,b,c,n,i,l:integer;
begin
   readln(s);
   i:=2;
   l:=1;
   a:=0;
   c:=0;
   n:=1;
   //значение a
   while (s[i-1]<>',') do
      begin
          if ((s[i]='-')and(i=2)) then n:=-n;
          if (s[i]in['0'..'9'])  then begin
            while (s[i]in['0'..'9']) do
               begin
                  b:=StrToInt(s[i]);
                  a:=a*10+b;
                  inc(i);
               end;
               Break;
          end;
          inc(i);
      end;
   a:=a*n;
   //значение c
   while ((s[i]<>']')and(s[i]<>')')) do
      begin
         if (s[i]='-')then l:=-l;
          if (s[i]in['0'..'9'])  then begin
            while (s[i]in['0'..'9']) do
               begin
                  b:=StrToInt(s[i]);
                  c:=c*10+b;
                  inc(i);
               end;
               Break;
          end;
          inc(i);
      end;
   c:=c*l;
   write(a,' ',c);
   readln;

end.
Еще раз спасибо.
Nikita++ вне форума Ответить с цитированием
Старый 09.11.2010, 23:23   #6
Nikita++
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 80
По умолчанию

Цитата:
Сообщение от Nikita++ Посмотреть сообщение
Спасибо за уделенное время, но я тут уже кое-что смоделировал:

Код:
program Project4;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
   s:string;
   a,b,c,n,i,l:integer;
begin
   readln(s);
   i:=2;
   l:=1;
   a:=0;
   c:=0;
   n:=1;
   //значение a
   while (s[i-1]<>',') do
      begin
          if ((s[i]='-')and(i=2)) then n:=-n;
          if (s[i]in['0'..'9'])  then begin
            while (s[i]in['0'..'9']) do
               begin
                  b:=StrToInt(s[i]);
                  a:=a*10+b;
                  inc(i);
               end;
               Break;
          end;
          inc(i);
      end;
   a:=a*n;
   //значение c
   while ((s[i]<>']')and(s[i]<>')')) do
      begin
         if (s[i]='-')then l:=-l;
          if (s[i]in['0'..'9'])  then begin
            while (s[i]in['0'..'9']) do
               begin
                  b:=StrToInt(s[i]);
                  c:=c*10+b;
                  inc(i);
               end;
               Break;
          end;
          inc(i);
      end;
   c:=c*l;
   write(a,' ',c);
   readln;

end.
Еще раз спасибо.
P.S.
Вашу программу пробовал, а она при (-234,45) 0 0 пишет.
Nikita++ вне форума Ответить с цитированием
Старый 10.11.2010, 00:19   #7
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Какой вопрос, такой ответ. В следующий раз четче пишите условия задания.
Вот:
Код:
program Project1;

{$APPTYPE CONSOLE}

var
  a,c :Integer;
  Err  :Integer;
  B,M,E :Integer; // начало, середина конец
  S,Buf :string; // входная строка, буффер значений
begin
 Write('Vvedite stroku: ');
 Readln(S);
 Writeln;
  // границы разделителей
 If Pos('[', S) > 0 then
  B := Pos('[', S)
 else
  If Pos('(', S) > 0 then
   B := Pos('(', S);

 M := Pos(',', S);

 If Pos(']', S) > 0 then
  E := Pos(']', S)
 else
  If Pos(')', S) > 0 then
   E := Pos(')', S);
  // значение A
 Buf := Copy(S, B + 1, M - (B+1));
 Val(Buf, a, Err);
  // значение C
 Buf := Copy(S, M + 1, E - (M+1));
 Val(Buf, C, Err);
  // выведем значения
 WriteLn(A, ' ', C);
 Readln;
end.
Alter вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
На Delphi 7 сделать игру кто хочет стать миллионером в delphi 7 666dart666 Помощь студентам 11 04.11.2010 17:57
Rad Studio 2011 XE: новое в Delphi, C++ Builder, RadPHP и Delphi Prism savva-paladin Софт 18 02.10.2010 20:24
Delphi. Как нарисовать в Delphi два движущиеся шара с определенной скоростью? redred Общие вопросы Delphi 10 11.12.2007 10:43
Как открыть БД, написанную в Delphi если нf другой машине Delphi нет? dagarik БД в Delphi 7 22.10.2007 17:54
не StringGrid1.Cells[1,1]:='Delphi'; а вот так SG1.C[1,1]:='Delphi' Nemesisking Компоненты Delphi 7 08.09.2007 03:27