Напишите собственную функцию(или процедуру) без обращений к системным функциям, которая преобразует строку в число.

var
a:string[5];
function StrToInt(i:integer):integer;
begin
if i>0
then StrToInt := 10 * StrToInt(i-1) + ord(a[i]) - ord('0')
else StrToInt := 0;
end;

begin
write('Введите строку:');
readln(a);
writeln('Integer:',StrToInt(length(a)):5);
end.

Решение приведённое выше работает только с целыми числами, если ввести в строке букву то задача отработает и выведет некорректный результат. Как быстрое и простое решение сгодится.
Ниже попробуем написать полноценное решение по переводу введенной строки в число, учтём в решении дробные числа и случай с отрицательным числом.
В решении нам понадобится функция ORD(c), которая возвращает порядковый номер символа «С». Вместо ord(«0») можно написать 48.
А теперь посмотрим на решение задачи.

Функция sttoint практически полностью повторяет решение предыдущей задачи, за тем исключением, что я убрал рекурсию, и функция теперь возвращает нцелое число, что снимает некоторые ограничения.
Для понимания решения опишу подробнее переменные:
S — первоначальная строка, после ввода строки сразу проверяем первый символ, если он « » то, в переменную B, записываем -1 число отрицательное, если такого символа в строке нет то просто 1, число положительное.
S1 — обработанная строка, сюда записывается строка с уже удаленными некорректными символами (буквы, пробелы и т. д. Здесь вообще можно вывести сообщение об ошибке и выйти из программ, но мы не ищем легких путей).
Prow — проверочная переменная, может случится так, что будет введена пустая строка или строка без единой цифры, тогда в S1 записываем «0».
K — номер позиции первой запятой или точки, так мы определяем введено дробное или целое число если к = 0, то число целое.

Дальше идут две закомментированные строки, они выводят промежуточные данные их можно удалить.
После этого мы вызываем функцию sttoint и передаём ей обработанную строку или две строки если число дробное, сперва целую часть потом дробную и складываем их, на выходе получает число типа real с которым можно работать дальше или просто вывести на печать. Тут вспомним о функции VAL стандартная функция паскаля, у неё есть небольшой недостаток, она работает только с целыми числами, попробуйте задать ей даже длинное целое число и посмотрите что будет, в решении ниже мы написали собственную функцию с более широкими возможностями.








program strtoint;

function sttoint(s : string) : real;
var
i1 : integer;
dl: integer;
z : real;
begin
i1 := 1;
z := 0;
repeat
dl := ord(s[i1]) - 48; {получаем порядковый номер символа}
{соотнесённого с числом}
z := z + dl * exp(ln(10)*(length(s)-i1));
i1 := i1 + 1;
until i1 = length(s) + 1;
sttoint := z;
end;

var
chisla, pr : set of char;
s, s1 : string;
i : integer;
k : integer; {номет запятой в строке}
zel, drob : real; {целая и дробная часть числа}
prow : boolean; {проверка}
b : integer; {положительное или отр. число}

begin
chisla := ['0'..'9'];
pr := [',', '.'];
s1 := '';
k := 0;
prow := true;
writeln('Введите строку.');
readln(s);
if s[1] = '-' then b := -1
else b := 1;

for i := 1 to length(s) do
if (s[i] IN chisla) or (s[i] IN pr) then
begin
s1 := s1 + s[i];
prow := false;
end
else writeln('Некоректные символы вырезаем.');
if prow then s1 := '0'; {если введена пустая строка или в стоке нет ни одной}
{цифры, то вводим туда 0}

for i := 1 to length(s1) do {определяем позиции точки или запятой}
begin
if k = 0 then
begin
if s1[i] in pr then k := i;
end
else if s1[i] in pr then delete(s1, i, 1); {удаляем все остальные}
end; {точки с запятыми}

//writeln('Точка или запятая на позиции = ', k);
//writeln('Исправл строка = ', s1);

if k = 0 then writeln(b * sttoint(s1):2:2)
else
begin
zel := sttoint(copy(s1, 1, k-1));
delete(s1, 1, k);
drob := sttoint(s1)/exp(ln(10)*(length(s1)));
zel := zel + drob;
writeln(b * zel:5:5);
end;
readln;
end.

(Скачать решение.)

Дана строка сформировать новую строку состоящую только из цифр.
 
program chislo;
var
chisla : set of char;
i : integer;
a, a1 : string;
b : integer;
begin
chisla := ['0'..'9']; {описываем множества чисел}
writeln('Введите число');
readln(a);
for i:=1 to length(a) do
if a[i] IN chisla then a1 := a1 + a[i] {формируем строку только из чисел}
else writeln('Удаляем не числа.');
i := length(a1);
writeln('кол-во чисел = ', i);
readln;
end.
 
Скачать решение.
Hosted by uCoz