Поиск вещественный чисел в произвольной строке символов - Pascal
Формулировка задачи:
Ребят, всем привет!
Нужна программа на паскале на тему "работа со строковыми переменными". Суть заключается в том, что в произвольной строке символов, которая может состоять из латинских букв, чисел, знаков препинания (русские буквы исп. нельзя) нужно найти все вещественные числа, т.е. в формате к примеру 3.14, 0.25 и т.д. вывести их на экран и посчитать их сумму.
пример:
строка - 5frtyu6.25obdz:,er' 3.7sa
числа - 6.25
3.7
их сумма = 9.95
Если такая программа есть, дайте ссылку, пожалуйста.)
Решение задачи: «Поиск вещественный чисел в произвольной строке символов»
textual
Листинг программы
const cf=['0'..'9'];{цифры} {все допустимые символы, латнские буквы, цифры и разделители} ds=['A'..'Z','a'..'z','0'..'9',#32,#33,#34,#39,#40,#41,#44,#45,#46,#58, #59,#63,#91,#93,#123,#124,#125,#126]; var s,s1:string; c:integer; sum,t:real; i,j,k:byte; begin clrscr; repeat k:=0; writeln('Введите строку из латинских букв, цифр и знаков препинания:'); readln(s); for i:=1 to length(s) do if not(s[i] in ds) then k:=1; if (k=1)or(s='') then writeln('Строка введена неверно! Повторите ввод.'); until (k=0)and(s<>''); writeln('Вещественные числа, входящие в строку:'); sum:=0;k:=0; for i:=1 to length(s) do if (s[i]='.')and(s[i-1] in cf)and(s[i+1] in cf) then{если точка между цифрами} begin k:=1;{фиксируем} j:=i-1;{идем назад} s1:='.';{строка пока только точка} while(s[j] in cf)and(j>=1) do{пока цифры} begin s1:=s[j]+s1;{составляем целую часть числа} j:=j-1; end; j:=i+1;{встаем за точкой} while(s[j] in cf)and(j<=length(s)) do{идем вперед пока цифры} begin s1:=s1+s[j];{составляем дробную часть} j:=j+1; end; val(s1,t,c);{преобразуем в число} write(t:0:2,' ');{выводим} sum:=sum+t;{суммируем} end; writeln; if k=0 then writeln('Вещественных чисел нет!') else write('Сумма=',sum:0:2); readln end.
Объяснение кода листинга программы
- const - объявляются константы
- ds - объявляется массив символов
- s, s1: string; - объявляются строковые переменные
- c: integer; - объявляется целочисленная переменная
- sum, t: real; - объявляются вещественные числа
- i, j, k: byte; - объявляются байтовые переменные
- begin - начинается выполнение программы
- clrscr; - очищается экран
- repeat - повторяется цикл
- k:=0; - устанавливается значение переменной k
- writeln('Введите строку из латинских букв, цифр и знаков препинания:'); - выводится сообщение и переменная s
- readln(s); - считывается введенная строка
- for i:=1 to length(s) do - выполняется цикл по каждому символу строки
- if not(s[i] in ds) then k:=1; - проверяется условие
- if (k=1) or (s='') then writeln('Строка введена неверно! Повторите ввод.'); - выводится сообщение
- until (k=0) and (s<>'); - выполняется до тех пор, пока k не станет равным нулю и s не станет пустой строкой
- writeln('Вещественные числа, входящие в строку:'); - выводится сообщение
- sum:=0; - устанавливается значение переменной sum
- k:=0; - устанавливается значение переменной k
- for i:=1 to length(s) do - выполняется цикл по каждому символу строки
- if (s[i]='.') and (s[i-1] in cf) and (s[i+1] in cf) then begin k:=1; j:=i-1; s1:='.'; while(s[j] in cf) and (j>=1) do begin s1:=s1+s[j]; j:=j-1; end; j:=i+1; while(s[j] in cf) and (j<=length(s)) do begin s1:=s1+s[j]; j:=j+1; end; val(s1,t,c); write(t:0:2,' '); sum:=sum+t; end;
- j:=i+1;
- while(s[j] in cf) and (j<=length(s)) do begin s1:=s1+s[j]; j:=j+1; end;
- if k=0 then writeln('Вещественных чисел нет!') else write('Сумма=',sum:0:2);
- readln;
- end.