2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Перевод строковых переменных в числовые(Pascal)
Сообщение14.07.2013, 19:22 


04/05/13
125
Подскажите пожалуйста, как можно перевести строковую переменную в числовую не используя встроенную функцию 'Val'?

 Профиль  
                  
 
 Re: Перевод строковых переменных в числовые(Pascal)
Сообщение14.07.2013, 19:29 
Заслуженный участник


27/04/09
28128
Идите по строке и делайте что-то со встречающимися символами.

Пусть, например, вы хотите обрабатывать только строки, представляющие неотрицательные целые числа — все символы такой строки из '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 


04/05/13
125
Мне запретили его использовать...сегодня был на консультации, а завтра у меня экзамен по информатике. Экзаменатор сказал, что кроме математических функций ничего другого встроенного использовать нельзя, даже 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 
Заслуженный участник


27/04/09
28128
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 


04/05/13
125
Спасибо, сейчас попробую по-экспериментировать..

 Профиль  
                  
 
 Re: Перевод строковых переменных в числовые(Pascal)
Сообщение15.07.2013, 08:50 
Заслуженный участник


06/07/11
5627
кран.набрать.грамота
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 


04/05/13
125
Да, спасибо. Мне как раз это надо. В прошлогодней задаче надо было выделить из строки семеричные числа. Только экзамен я уже прошел, и это не понадобилось...

 Профиль  
                  
 
 Re: Перевод строковых переменных в числовые(Pascal)
Сообщение15.07.2013, 20:25 
Заслуженный участник


27/04/09
28128
Строки си — это указатели на символ (обычно за символом, на который указывает значение, идут другие, а потом символ с кодом 0. Так что прибаляя к строке 0, можно получить что угодно, но не код — сначала надо разименовать указатель. Строки стандартной библиотеки C++ — объекты, но, вроде, там нет приведения к целому такого, чтобы получался код первого или другого символа строки (в самом деле, что бы тогда делать с пустой строкой?). Так что строки так себя вести не станут. Только символы.

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

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

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

 Профиль  
                  
 
 Re: Перевод строковых переменных в числовые(Pascal)
Сообщение16.07.2013, 10:33 
Заслуженный участник


11/05/08
32166
Используется синтаксис 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 


17/07/13
16
С учетом могущих стоять в начале '+' или '-', а также разделения '.' или ',':

код: [ скачать ] [ спрятать ]
Используется синтаксис 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 
Заслуженный участник


27/04/09
28128
Если не ошибаюсь, ваш код примет строку "2,5.abc". Я бы делал конечным автоматом.

 Профиль  
                  
 
 Re: Перевод строковых переменных в числовые(Pascal)
Сообщение19.07.2013, 23:17 
Заслуженный участник


09/09/10
3729
arseniiv в сообщении #747416 писал(а):
Если не ошибаюсь, ваш код примет строку "2,5.abc".

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

 Профиль  
                  
 
 Re: Перевод строковых переменных в числовые(Pascal)
Сообщение19.07.2013, 23:30 
Заслуженный участник


27/04/09
28128
А что с ним? Если он принимает такие строки, но выбирает из них только первое число, а не переводит 'a' в Ord('a') - Ord('0') [о, вспомнил ту самую функцию получения числа!], это не страшно. :lol:

 Профиль  
                  
 
 Re: Перевод строковых переменных в числовые(Pascal)
Сообщение20.07.2013, 19:28 
Заслуженный участник


11/05/08
32166
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 
Аватара пользователя


07/01/12

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

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group