Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.137.185.180] |
|
Сообщ.
#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 Кбайт, скачиваний: 124) |
Сообщ.
#13
,
|
|
|
YaSonka
Не знаю, попробовал - все нормально работает. Как и положенно выдает что не является числом. Кстати надо еще добавить проверку последнего символоа чтоб он не был точкой или Е., а также смотреть на взаимное расположение точки и Е а то запись типа 123Е-4.4 будет рассматриваться как число. |
Сообщ.
#14
,
|
|
|
Bush3000
Pascal эти числа (123.е-1 (123.е+1) воспринимает как корректные. |
Сообщ.
#15
,
|
|
|
YaSonka
Подожди. То есть ты хочешь сказать что такие числа должны распозноваться как правильные или прога распознает их как правильные? |
Сообщ.
#16
,
|
|
|
Bush3000
Должны как правильные, наверное. Так как после запятой незначащий ноль можно отбрасывать. Паскаль, во всяком случае, такие числа считает правильными. |
Сообщ.
#17
,
|
|
|
Цитата YaSonka @ Должны как правильные, наверное. Так как после запятой незначащий ноль можно отбрасывать. Паскаль, во всяком случае, такие числа считает правильными. Более, того, процедуры read[ln] и val воспринимают и такие числа: '.5', о вот компилятор TP/BP по какой-то причине нет |
Сообщ.
#18
,
|
|
|
YaSonka
Сегодня узнавал у нашего препода насчет этого вопроса. Говорит что это не число которое воспинимает Паскаль(кстати работу засчитала). Но даже если это и число все можно легко исправить убрав строку if (s[i] in p)and(s[i+1] in ost) then b:=false; |
Сообщ.
#19
,
|
|
|
Цитата Bush3000 @ Сегодня узнавал у нашего препода насчет этого вопроса. Говорит что это не число которое воспинимает Паскаль Ну, если преподаватель сказала, то тогда конечно! А это ничего, что Турбо Паскаль вот такую строчку: const test = 5.; спокойно воспринимает? Цитата Bush3000 @ (кстати работу засчитала) И это при том, что программа твоя воспринимает как правильное такое число: "1e". И вот такое: "1e-". И даже вот такое: "-e". Впрочем, с учетом предыдущего абзаца это не удивительно. |
Сообщ.
#20
,
|
|
|
Bug Hunter
Подумаешь. Всего лишь и надо добавить проверку принадлежности последнего символа к множествам ost, p и z и если принадлежит то b присвоить значение false. В конце концов я только учусь программированию. |
Сообщ.
#21
,
|
|
|
Так кто нить может показать финальную прогу?
|
Сообщ.
#22
,
|
|
|
Вряд ли такая прога вообще может существовать, т.к. исходная постановка задачи, IMHO, трижды некорректна.
Напомню: Цитата Bush3000 @ (Подразумевается, что вывод нужно сделать, анализируя строку, а не переводя число из символьного представления в двоичное)Програма вводит строку символов и проверяет может ли эта строка быть записью числа в языке Паскаль. Во-первых, Паскалей много, хороших и разных, и понятия допустимого символьного представления числа в них могут несколько отличаться; Во-вторых, даже если ограничиться Турбо Паскалем, то, как отмечалось выше, он придерживается то ли дуализма мнений, то ли политики двойных стандартов по отношению к незначащим нулям перед и после десятичной точки; В-третьих, Турбо Паскаль считает такую вот запись 1.1e4932 допустимым числом, а 1.1e4933 и 1.2e4932 - уже нет. Различить эти записи, анализируя строку, конечно, можно, если сильно запариться, но уж точно нафиг не нужно. 2ALL: Но потанцевать таки можно! Если поставить задачу так: Написать программу, которая вводит строку и проверяет, является ли она записью числа вида: [+|-]ddd[.ddd][E|e[+|-]ddd] где число десятичных цифр в мантисе и порядке может быть любым (лишь бы, для простоты, сама запись в обычную строку string влезало) Я это к тому что в этой задаче есть заковыка, реальный способ преодоления которой никто таки не предложил, да и я сам нашел решение только со второй попытки. И не уверен, что оно самое эффективное (предполагается, что задача решается через множества типа set of char в качестве упражнения). Так что есть повод пободаться! А еще можно немного усложнить(?) задачу, потребовав, чтобы решение не использовало по крайней мере "больших" множест типа set of char|byte и их подмножеств (решения, использующие эмуляцию множеств через булев массив или битовые карты длинной больше чем одно слово тоже не принимаются) - это уже действительно неплохой этюд может получиться. Ну, что, будем бодаться? За себя: Battle!!! (Х/ф "Майкл) |
Сообщ.
#23
,
|
|
|
Вот что у меня получилось:
program alexpr2; type t = set of char; var s: string; i, s1, s2, posl : integer; fl : integer; n, z, ost, all, p : t; begin begin repeat writeln(' Vvedite text, zakanch. "!"'); write(' s = '); readln(s); if ( s[length(s)]<>'!' ) then writeln(' !! Oshibka vvoda !!') until s[length(s)]='!' end; posl:=length(s)-1; fl:=0; n:=['0'..'9']; z:=['+','-']; ost:=['e','E']; p:=['.']; all:=['0'..'9','+','-','.','e','E']; if (s[1] in p+ost) or (s[posl] in p+ost+z) then fl:=1; s1:=0; s2:=0; i:=1; while ( i<=posl ) and (fl=0) do begin if not(s[i] in all) then fl:=1; begin if (s[i] in n) and (s[i+1] in z) then fl:=1; if (s[i] in p) and (s[i+1] in z) then fl:=1; if (s[i] in ost) and (s[i+1] in p) then fl:=1; if (s[i] in p) and (s[i+1] in p) then fl:=1; if (s[i] in z) and (s[i+1] in z) then fl:=1; if s[i] in p then s1:=s1+1; if s[i] in ost then s2:=s2+1; if s1>1 then fl:=1; if s2>1 then fl:=1; end; inc(i); end; if s1+s2=0 then fl:=1; if fl=0 then writeln(' !! Ok !!') else writeln(' !! Error !!'); readln end. Условие задачи следующее: определить, является ли введенный текст, заканч. "!" правильной записью вещественного числа (либо в форме с фиксированной точкой, либо в форме с плавающей точкой). Задачу приняли, проверял на косяки - вроде всё норм. Про теги не забывай... |
Сообщ.
#24
,
|
|
|
Цитата Bug Hunter @ Если поставить задачу так: Написать программу, которая вводит строку и проверяет, является ли она записью числа вида: [+|-]ddd[.ddd][E|e[+|-]ddd] где число десятичных цифр в мантисе и поряде может быть любым (лишь бы, для простоты, сама запись в обычную строку string влезало) Я на всякий случай уточню, для тех, кто не сразу просек, что данная спецификация предполагает, что перед и после десятичной точки (если она есть) обязательно должно быть хотя бы по одной цифре (хотя бы незначащие нули) и мантиса не может быть пустой или состоять из одного знака (иначе как понять, "-E10" - это число или имя переменной с унарным минусом). Хотя желающие принять участие в соревновании могут написать дополнительно вариант, который распознает и записи числа вида ".5", "5.", ".5E10", "5.E10" и т.п. (число ".", я думаю, надо запретить). Цитата AlexPR @ Вот что у меня получилось: ... Условие задачи следующее: определить, является ли введенный текст, заканч. "!", правильной записью вещественного числа ... Не вдаваясь особо в подробности, сразу скажу, что это решение несколько другой, весьма искусственной задачи. Is there no one else? (Что, больше никого? (англ.)) (Х/ф "Троя") |
Сообщ.
#25
,
|
|
|
Цитата AlexPR @ Задачу приняли, проверял на косяки - вроде всё норм. Плохо проверял: Vvedite text, zakanch. "!" s = 123e4.5! !! Ok !! |
Сообщ.
#26
,
|
|
|
Гек-тор! Гек-тор!!! (Х/ф "Троя")
|
Сообщ.
#27
,
|
|
|
Bug Hunter, давай не будем поднимать темы, которые никому не интересны? Было бы интересно - ответили б уже... Что, обязательно закрывать, чтоб не флудили?
|