- Напишите собственную функцию(или процедуру) без
обращений к системным функциям, которая преобразует строку в число.
- 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.-
- Скачать решение.