2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Перевод строковых переменных в числовые(Pascal)
Сообщение14.07.2013, 19:22 
Подскажите пожалуйста, как можно перевести строковую переменную в числовую не используя встроенную функцию 'Val'?

 
 
 
 Re: Перевод строковых переменных в числовые(Pascal)
Сообщение14.07.2013, 19:29 
Идите по строке и делайте что-то со встречающимися символами.

Пусть, например, вы хотите обрабатывать только строки, представляющие неотрицательные целые числа — все символы такой строки из '0'..'9'. Строка "2401" — это представление числа $2\cdot10^3 + 4\cdot10^2 + 0\cdot10^1 + 1\cdot10^0$.

-- Вс июл 14, 2013 22:30:52 --

А по каким причинам вы не используете Val?

 
 
 
 Re: Перевод строковых переменных в числовые(Pascal)
Сообщение14.07.2013, 19:35 
Мне запретили его использовать...сегодня был на консультации, а завтра у меня экзамен по информатике. Экзаменатор сказал, что кроме математических функций ничего другого встроенного использовать нельзя, даже Val и Chr

-- 14.07.2013, 21:39 --

В прошлом году была задачка которую не решить без Val.
Еще он сказал что в C можно сделать так:
предположим что у нас есть строковая переменная A, в которой содержится число 686 в виде строки. Если мы прибавим к нему строку содержащую число 0, то это возвратит нам числовую переменную 686, т.е. B:=A+'0' даст нам числовую переменную В равную 686

-- 14.07.2013, 21:41 --

arseniiv в сообщении #745919 писал(а):
Пусть, например, вы хотите обрабатывать только строки, представляющие неотрицательные целые числа — все символы такой строки из '0'..'9'. Строка "2401" — это представление числа $2\cdot10^3 + 4\cdot10^2 + 0\cdot10^1 + 1\cdot10^0$.

я не совсем понимаю как мне записать в другую переменную число из строковой пользуясь вашим методом, но не используя Val

 
 
 
 Re: Перевод строковых переменных в числовые(Pascal)
Сообщение14.07.2013, 20:04 
inky в сообщении #745922 писал(а):
Еще он сказал что в C можно сделать так:
предположим что у нас есть строковая переменная A, в которой содержится число 686 в виде строки. Если мы прибавим к нему строку содержащую число 0, то это возвратит нам числовую переменную 686, т.е. B:=A+'0' даст нам числовую переменную В равную 686
А не должно бы. Вот если (и в C, и в Pascal) отнять от символа (не строки) символ '0', получится число, которое равно от 0 до 9 для символов '0', …, '9' соответственно, потому что эти символы имеют друг за другом идущие коды. Правда, насколько помню, в паскале нельзя вычитать символы — сначала надо привести их к какому-нибудь целому типу (вам должен подойти Byte).

inky в сообщении #745922 писал(а):
я не совсем понимаю как мне записать в другую переменную число из строковой пользуясь вашим методом, но не используя Val
Попробуйте заполнить содержимым вот такую оболочку:
Используется синтаксис Pascal
{ где-то наверху... }
var
  i: Integer;
  s: String;
  c: Char;
{ интересующий кусок: }
for i := 1 to Length(s) do begin
  c = s[i];
  { ??? }
end;
 

Вот вы подумайте, как могла бы работать сама Val? У распространённых процессоров обычно нет инструкции для перевода строки в число.

Чтобы обрабатывать отрицательные числа, надо будет ещё учитывать, что строка может начинаться символом '-', и для полноты может начинаться ещё и символом '+'. Чтобы обрабатывать дробные числа, надо будет учесть, что в середине строки может встречаться разделитель ('.' и по праздникам ','), хотя от некоторых любителей писать E и это не спасёт.

-- Вс июл 14, 2013 23:07:03 --

Кстати, если вам не понравится тот цикл с to, можете использовать цикл и с downto.

 
 
 
 Re: Перевод строковых переменных в числовые(Pascal)
Сообщение14.07.2013, 20:13 
Спасибо, сейчас попробую по-экспериментировать..

 
 
 
 Re: Перевод строковых переменных в числовые(Pascal)
Сообщение15.07.2013, 08:50 
inky в сообщении #745922 писал(а):
В прошлом году была задачка которую не решить без Val.
Еще он сказал что в C можно сделать так:
предположим что у нас есть строковая переменная A, в которой содержится число 686 в виде строки. Если мы прибавим к нему строку содержащую число 0, то это возвратит нам числовую переменную 686, т.е. B:=A+'0' даст нам числовую переменную В равную 686
Это называется "неявное преобразование типов". Во-первых, функция перевода строки в число при этом все равно вызывается (только неявно, компилятором), во-вторых, в С и в паскале неявного преобразования строк в число нет, в-третьих, "на производстве" (то есть когда будете работать и за деньги писать код) за такое отрывают руки, бьют по голове, а в случае множественных рецидивов - выгоняют голым на мороз со справкой о профнепригодности.

-- 15.07.2013, 10:03 --

P. S. На самом деле, в Си это может работать (я, правда, си только в теории знаю), но немного не так. Если у вас есть строковая переменная, которая содержит строку "6", то в ячейке памяти содержится число 54 (ASCII-код символа "6"). И если вы напишете на Си "6" + 0 - вы в строковую переменную получите число 54. Подобный трюк можно провести в паскале (не знаю, с какой версии "обычного паскаля" это работает, на фрипаскале работает).
Выглядит это так:
Код:
var
a: string;
b: integer;
begin
  a:= '6';
  b:= byte(a);
  writeln(b);
end;

Это называется "type cast", или "кастинг" - когда компилятор считает, что некая область памяти является переменной одного типа, а вы предлагаете компилятору считать эту переменную другим типом и берете на себя ответственность за последствия. Может, вам это надо? Посимвольно пройти строку и превратить каждый символ в знак в числе?

 
 
 
 Re: Перевод строковых переменных в числовые(Pascal)
Сообщение15.07.2013, 11:48 
Да, спасибо. Мне как раз это надо. В прошлогодней задаче надо было выделить из строки семеричные числа. Только экзамен я уже прошел, и это не понадобилось...

 
 
 
 Re: Перевод строковых переменных в числовые(Pascal)
Сообщение15.07.2013, 20:25 
Строки си — это указатели на символ (обычно за символом, на который указывает значение, идут другие, а потом символ с кодом 0. Так что прибаляя к строке 0, можно получить что угодно, но не код — сначала надо разименовать указатель. Строки стандартной библиотеки C++ — объекты, но, вроде, там нет приведения к целому такого, чтобы получался код первого или другого символа строки (в самом деле, что бы тогда делать с пустой строкой?). Так что строки так себя вести не станут. Только символы.

Строки «старого» паскаля складывать-вычитать тоже ни с чем нельзя, и приводить к целому типу тоже стоит только символы.

-- Пн июл 15, 2013 23:27:31 --

Не думаю, что искуственный запрет на использование Val нужен, чтобы породить некомпилирующееся преобразование строки в байт. Стоит без читерства написать посимвольное преобразование.

 
 
 
 Re: Перевод строковых переменных в числовые(Pascal)
Сообщение16.07.2013, 10:33 
Используется синтаксис Pascal
n:=0;
for i:=1 to length(s) do
    n:=n*10 + byte(s[i]) - byte('0');
 

 
 
 
 Re: Перевод строковых переменных в числовые(Pascal)
Сообщение19.07.2013, 01:04 
С учетом могущих стоять в начале '+' или '-', а также разделения '.' или ',':

код: [ скачать ] [ спрятать ]
Используется синтаксис Pascal
function StringToReal (var s: string): real;
var
  i, j, sign: integer;
  fract:real;
begin
  result := 0;

  if (s[1] = '-') or (s[1] = '+') then i := 2; else i := 1;
  if (s[1] = '-') then sign := -1; else sign := 1;
 
  while (i <= length(s)) and (s[i] <> '.') and (s[i] <> ',') do begin
    result := result*10 + byte(s[i]) - byte('0');
    Inc(i);
  end;
  Inc(i);

  fract := 0;
  j := length(s);
  while i <= j do begin
    fract := fract/10 + (byte(s[j]) - byte('0'))/10;
    Dec(j);
  end;

  result := sign*(result + fract);
end;
 


Не проверял, возможны глюки :-)

 
 
 
 Re: Перевод строковых переменных в числовые(Pascal)
Сообщение19.07.2013, 12:35 
Если не ошибаюсь, ваш код примет строку "2,5.abc". Я бы делал конечным автоматом.

 
 
 
 Re: Перевод строковых переменных в числовые(Pascal)
Сообщение19.07.2013, 23:17 
arseniiv в сообщении #747416 писал(а):
Если не ошибаюсь, ваш код примет строку "2,5.abc".

Разве ж это плохо? Вы еще PHP не видели... :wink:

 
 
 
 Re: Перевод строковых переменных в числовые(Pascal)
Сообщение19.07.2013, 23:30 
А что с ним? Если он принимает такие строки, но выбирает из них только первое число, а не переводит 'a' в Ord('a') - Ord('0') [о, вспомнил ту самую функцию получения числа!], это не страшно. :lol:

 
 
 
 Re: Перевод строковых переменных в числовые(Pascal)
Сообщение20.07.2013, 19:28 
Ilya86 в сообщении #747322 писал(а):
С учетом могущих стоять в начале '+' или '-', а также разделения '.' или ',':


код: [ скачать ] [ спрятать ]
Используется синтаксис Pascal
function StringToReal (s: string): real;
var  i, sign: integer;
     u,d: real;
     frac: boolean;
begin
  u:=0;
  d:=1;
  sign:=1;
  frac:=false;

  for i:=1 to length(s) do begin
    if s[i]='-' then begin    sign:=-1;    continue;    end;
    if s[i] in [',', '.'] then begin    frac:=true;    continue;    end;    
    if s[i] in ['0'..'9'] then begin
      u:=u*10 +  byte(s[i]) - byte('0');
      if frac then d:=d*10;
    end;
  end;

  StringToReal:=sign*u/d;
end;
 


Не проверял, возможны глюки :-)

 
 
 
 Re: Перевод строковых переменных в числовые(Pascal)
Сообщение22.07.2013, 11:40 
Аватара пользователя
inky в сообщении #745922 писал(а):
Мне запретили его использовать...сегодня был на консультации, а завтра у меня экзамен по информатике. Экзаменатор сказал, что кроме математических функций ничего другого встроенного использовать нельзя, даже Val и Chr

Я писал такие функции даже на асм для целых чисел и чисел с точкой (форма F Фортрана).
Вот красивый пионерский алгоритм для целых: в начале результат = 0. идём по строке с начала, если встречаем минус, то запоминаем, что число отрицательное. Далее считываем цифры, при каждой цифре умножаем результат на 10 и прибавляем ASCII код этой цифры, вычитая из него ASCII код символа '0'. В конце инвертируем результат, если число отрицательное.

 
 
 [ Сообщений: 15 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group