Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.145.54.7] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Помогите мне. Очень прошу. Надо написать прогу на Турбопаскале. Условие такое: Програма вводит строку символов и проверяет может ли эта строка быть записью числа в языке Паскаль. Следует учесть что числами являются -6.54Е-2 или 12Е5. Это связано с темой множественного типа данных поэтому надо его использовать.
|
Сообщ.
#2
,
|
|
|
Сообщ.
#3
,
|
|
|
KiRiK
да теорию я знаю. пытался да же что то сделать но окончательно запутался в условных операторах. Очень их там много. |
Сообщ.
#4
,
|
|
|
Type RealDigits = set of char; Const Digits: RealDigits = ['0','1','2','3','4','5','6','7','8','9','.','E','e','-']; Var S:String; i:integer; flag: boolean; begin Readln(s); flag:=true; for i:=1 to Length(s) do if not(s[i] in Digits) then begin flag:=false; break; end; if flag then WriteLn('Ok!') else WriteLn('Error!'); readln; end. |
Сообщ.
#5
,
|
|
|
YaSonka, надо бы еще проверять на повторное вхождение букв 'e' и 'E', т.е. после первого обнаружения одной из них в строке изымать обе из множества, иначе строка '1.2EE-2' будет распознаваться как число...
Да и точка может быть только одна, так что с ней то же самое. |
Сообщ.
#6
,
|
|
|
volvo877
То же самое и с минусом. Также нужно добавить в множество +. Ибо такая запись - 123E+12 вполне возможна. |
Сообщ.
#7
,
|
|
|
С минусом нельзя...
-1.2E-6 вполне себе нормальная запись... |
Сообщ.
#8
,
|
|
|
volvo877
Не-а, я имел ввиду 123e--2 |
Сообщ.
#9
,
|
|
|
volvo877
А я и не думала даже. Не сообразила. Наверное, Bush3000 доделает сам. |
Сообщ.
#10
,
|
|
|
YaSonka
Точно. И так очень сильно помогли. Огромное вам всем спасибо. UPD: кстати кому интересно вот мое решение этой задачи Type T = set of char; Var S:String; i,j,s1,s2:integer; b: boolean; N,Z,Ost,all,P:t; begin write('s='); Readln(s); b:=true; N:=['0'..'9']; Z:=['+','-']; Ost:=['e','E']; P:=['.']; All:=['0'..'9','+','-','.','e','E']; s1:=0; s2:=0; if (s[1] in p)or(s[1] in ost) then b:=false; for i:=1 to Length(s) do begin if not(s[i] in All) then b:=false; if (s[i] in n)and(s[i+1] in z) then b:=false; if (s[i] in p)and(s[i+1] in z) then b:=false; if (s[i] in p)and(s[i+1] in ost) then b:=false; if (s[i] in ost)and(s[i+1] in p) then b:=false; if (s[i] in z)and(s[i+1] in z) then b:=false; if s[i] in p then s1:=s1+1; if s[i] in ost then s2:=s2+1 end; if s1>1 then b:=false; if s2>1 then b:=false; if b then writeln('ok') else writeln('Error!'); readln end. |
Сообщ.
#11
,
|
|
|
Bush3000
На такой строке 123.е-1 (123.е+1) выдает ошибку. |
Сообщ.
#12
,
|
|
|
кусок спецификации паскаля по числам в прикрепленном файле... я в свое время по ней писал синтаксический анализатор... все работало...
просто начинаешь с самого большого куска и процедурами детализируешь разбор. Прикреплённый файл1.rar (3.51 Кбайт, скачиваний: 126) |
Сообщ.
#13
,
|
|
|
YaSonka
Не знаю, попробовал - все нормально работает. Как и положенно выдает что не является числом. Кстати надо еще добавить проверку последнего символоа чтоб он не был точкой или Е., а также смотреть на взаимное расположение точки и Е а то запись типа 123Е-4.4 будет рассматриваться как число. |
Сообщ.
#14
,
|
|
|
Bush3000
Pascal эти числа (123.е-1 (123.е+1) воспринимает как корректные. |
Сообщ.
#15
,
|
|
|
YaSonka
Подожди. То есть ты хочешь сказать что такие числа должны распозноваться как правильные или прога распознает их как правильные? |