Форум программистов, компьютерный форум, киберфорум
Наши страницы

Free Pascal

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.84
SorryItsGg
0 / 0 / 0
Регистрация: 30.08.2009
Сообщений: 11
#1

Рекурсия, определение правильности ввода числа. - Free Pascal

30.08.2009, 23:04. Просмотров 2471. Ответов 22
Метки нет (Все метки)

помогите составить программу пожалуйсто....надо определить является ли заданая строка правильной записью числа (возможно со знаком)...число надо вводить посимвольно ...надо чтобы была рекурсивная функция

вот мои наброски...

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
uses crt;
var s:string;
code:integer;
w:real;
begin
writeln('Vvedite 4islo');
readln(s);
while pos('',s)<>0 do delete (s,pos('',s),1);
Val(s,w,code);
If code=0 then writeln('TRUE: ',s) else writeln('FALSE: ',s);
writeln('stroka');
readln(s);
end.
помогите пожалуйсто сделать рекурсивную функцию.....
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.08.2009, 23:04
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Рекурсия, определение правильности ввода числа. (Free Pascal):

Функция проверки правильности ввода - Free Pascal
мне нужна функция проверяющая правильность ввода данных с клавиатуры предположим необходимо вводить только целые числа))

Программа проверки правильности ввода даты - Pascal
Здравствуйте! Помогите составить программу Программа проверки правильности ввода даты.При составлении использовать переменную типа...

Программа проверки правильности ввода автомобильного номера - Pascal
Опять взываю к высшим.Прошу помочь.Задача звучит так:Автомобильные номера России в большинстве случаев состоят из первой буквы,...

Рекурсия: определение максимума из двух чисел - Pascal
Добрый день или вечер! Помогите разобраться в задаче на рекурсию. Не пойму, какой из вариантов правильный. Нашла эту задачу на...

Рекурсия - определение сопротивления между клеммами - Pascal

Определение минимального и максимального значений во время ввода данных - Pascal
Известны расстояния от Москвы до нескольких городов. Найти расстояние от Москвы до самого удалённого от него города из представленных в...

22
SorryItsGg
0 / 0 / 0
Регистрация: 30.08.2009
Сообщений: 11
31.08.2009, 13:30  [ТС] #16
Искрене прошу прощения....сразу не подумал....еще раз извините
0
Puporev
Модератор
54031 / 41664 / 14741
Регистрация: 18.05.2008
Сообщений: 97,961
31.08.2009, 16:15 #17
Вот пример программы для рекурсивного определения целого числа. Может кому пригодится. Как рекурсивно определять вещественное не знаю.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
uses crt;
function Prav(st:string;k:byte):boolean;{рекурсивная функция}
begin
if st=''then{если пустая строка}
  begin
    Prav:=false;
    exit;{завершаем функцию}
  end;
if k<>length(st) then {если не конец строки}
  begin
    if not(st[k] in ['0'..'9']) or not(st[1] in ['-','1'..'9']){если не цифра или первый символ не минус и не 1-9(0 нельзя)}
    or((st[1]='-')and not(st[2] in ['1'..'9']))   {или первая минус, а вторая не 1-9(ноль нельзя)}
    or((st[1] in ['1'..'9'])and not(st[2] in ['0'..'9'])) then{или первый=1-9 и второй не цифра}
       begin
        Prav:=false;
        exit;
      end
   else Prav:=Prav(st,k+1);{если нормально, смотрим следующий символ}
end;
end;
 
var c:char;
    s:string;
    n:byte;
begin
clrscr;
writeln('Vvedite chislo, окончание ввода Enther:');
s:='';{пустая строка}
repeat
c:=readkey;{читаем символ}
write(c);
s:=s+c;{добавляем в строку}
until c=#13;{Enter, конец}
writeln;
if s[1]='-' then n:=2{если первый символ минус, начинаем со 2 символа}
else n:=1;{начинаем с 1-го символа}
if Prav(s,n)then write('Это число!')
else write('Это не число!');
readln
end.
Добавлено через 55 минут
Немного поправил программу, чтоб ноль числом считала и последний символ не проверяла.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
uses crt;
function Prav(st:string;k:byte):boolean;{рекурсивная функция}
begin
if st=''then{если пустая строка}
  begin
    Prav:=false;
    exit;{завершаем функцию}
  end;
if st='0' then
 begin
  Prav:=true;
  exit;
 end
else if k<=length(st) then {если не конец строки}
  begin
    if not(st[k] in ['0'..'9']) or not(st[1] in ['-','1'..'9']){если не цифра или первый символ не минус и не 1-9(0 нельзя)}
    or((st[1]='-')and not(st[2] in ['1'..'9']))   {или первая минус, а вторая не 1-9(ноль нельзя)}
    or((st[1] in ['1'..'9'])and not(st[2] in ['0'..'9'])) then{или первый=1-9 и второй не цифра}
       begin
        Prav:=false;
        exit;
      end
   else Prav:=Prav(st,k+1);{если нормально, смотрим следующий символ}
end;
end;
 
var c:char;
    s:string;
    n:byte;
begin
clrscr;
writeln('Vvedite chislo, окончание ввода Enther:');
s:='';{пустая строка}
repeat
c:=readkey;{читаем символ}
write(c);
s:=s+c;{добавляем в строку}
until c=#13;{Enter, конец}
delete(s,length(s),1);
writeln;
if s[1]='-' then n:=2{если первый символ минус, начинаем со 2 символа}
else n:=1;{начинаем с 1-го символа}
if Prav(s,n)then write('Это число!')
else write('Это не число!');
readln
end.
0
TAVulator
3950 / 1109 / 72
Регистрация: 27.07.2009
Сообщений: 3,457
31.08.2009, 19:36 #18
Цитата Сообщение от SorryItsGg Посмотреть сообщение
Вот : число может быть представлено либо в виде числа с фиксированной десятичной точкой (-214.78), либо в виде числа с плавающей точкой десятичной точкой(-2.1478E+02).
для такого варианта вот:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
Var
 S: string;
 
Function ch(st:string):boolean;
Begin
 if pos(#1,st)=0 then st:=st+#1+'00001';
 if pos(#1,st)<>1 then
 if (st[1]='-')and
    (st[length(st)-3]='0') then
  Begin
   delete(st,length(st)-3,1);
   insert('1',st,length(st)-2);
   delete(st,1,1);
   ch:=ch(st);
  End else
 if (st[1]='E')and
    (st[length(st)-2]='0')and
    (st[length(st)-3]='1') then
  Begin
   delete(st,length(st)-2,1);
   insert('1',st,length(st)-1);
   delete(st,length(st),1);
   st:=st+'0';
   delete(st,length(st)-4,1);
   insert('1',st,length(st)-3);
   delete(st,1,1);
   ch:=ch(st);
  end else
 if (st[1]='.')and
    (st[length(st)-1]='0') then
  Begin
   delete(st,length(st)-2,1);
   insert('1',st,length(st)-1);
   delete(st,length(st),1);
   st:=st+'1';
   delete(st,length(st)-1,1);
   insert('1',st,length(st));
   delete(st,1,1);
   ch:=ch(st);
  End else
 if (st[1]='+')and
    (st[length(st)]='0') then
  Begin
   delete(st,length(st)-4,1);
   insert('0',st,length(st)-3);
   delete(st,length(st),1);
   st:=st+'1';
   delete(st,1,1);
   ch:=ch(st);
  End else
 if (st[1] in ['0'..'9'])and
    (st[length(st)-4]='0') then
  Begin
   delete(st,1,1);
   delete(st,length(st)-3,1);
   insert('1',st,length(st)-2);
   delete(st,length(st)-2,1);
   insert('0',st,length(st)-1);
   delete(st,length(st),1);
   st:=st+'1';
   ch:=ch(st);
  End else ch:=false;
End;
 
Begin
 write('Input: ');
 Readln(s);
 if ch(s) then Writeln('True')
 else writeln('False');
 Readln;
End.
Конечно немного по-извращенски, но работает
1
dim-hj
28 / 25 / 0
Регистрация: 28.07.2009
Сообщений: 109
01.09.2009, 08:05 #19
Цитата Сообщение от polivets Посмотреть сообщение
Полностью согласен. Копмиляторы паскаля, придерживающиеся стандарта, просто-напросто неоткомпилят данный код.
Turbo и Free весьма далеки от стандартов.

Delphi, мне кажется, скомпилировала бы этот код. Проверить пока негде.
0
Puporev
Модератор
54031 / 41664 / 14741
Регистрация: 18.05.2008
Сообщений: 97,961
01.09.2009, 08:24 #20
Delphi, мне кажется, скомпилировала бы этот код. Проверить пока негде.
Так и Free Pascal компилирует структуры типа ch(). Турбо Паскаль не компилирует. Делфи тоже компилирует, я все проверил. Во Free Pascal вообще много делфийских фишек.
Просто подавляющее большинство авторов в этом разделе юзают Турбо Паскаль 7.0, реже 7.1.
Просто код написанный для Турбо, компилируется в Фрее, наоборот-нет.
0
TAVulator
3950 / 1109 / 72
Регистрация: 27.07.2009
Сообщений: 3,457
01.09.2009, 08:47 #21
Цитата Сообщение от Puporev Посмотреть сообщение
Просто код написанный для Турбо, компилируется в Фрее, наоборот-нет.
хмм... во Free Pascal у меня постоянно проблема с динамическими массивами. Они там как-то не хотят работать, а в Турбо работают )))

Добавлено через 50 секунд
под динамическим массивом имею ввиду указатель на массив array[1..1] of ...
0
Puporev
Модератор
54031 / 41664 / 14741
Регистрация: 18.05.2008
Сообщений: 97,961
01.09.2009, 08:57 #22
Вот здесь есть вещи, несовместимые в Турбо и Фрее, но про такие массивы что-то там не нашел.
http://freepascal.ru/wiki/index.php?...7_Turbo_Pascal
Вообще, по-моему, это единственное боле-менее приличное руководство по Фрее.
http://freepascal.ru/wiki/index.php?...BE%D0%B4%D1%8B
0
Puporev
Модератор
54031 / 41664 / 14741
Регистрация: 18.05.2008
Сообщений: 97,961
01.09.2009, 16:36 #23
Поборол свою природную лень и написал эту программу. Не нашел четкого ответа про ведущие ноли, оставил как правильное, тем более Турбо Паскаль их воспринимает нормально, выражения типа 0002*0003 считает.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
uses crt;
function Prav_C(st:string;k:byte):boolean;{определение правильного целого числа - рекурсия}
begin
if st='' then Prav_C:=false
else
 begin
  if not (st[k] in ['0'..'9'])then Prav_C:=false{ведущие ноли считаем правильно}
  else if k<length(st) then Prav_C:=Prav_C(st,k+1);
 end;
end;
 
function Prav_FT(st:string):boolean;{определение правильного вещественного с фиксированной точкой}
var s1,s2:string;
begin
s1:=copy(st,1,pos('.',st)-1);{до точки - целое}
s2:=copy(st,pos('.',st)+1,255);{после точки - целое}
if Prav_C(s1,1)and Prav_C(s2,1) then Prav_FT:=true
else Prav_FT:=false;
end;
 
function Prav_PT(st:string):boolean;{проверка вещественного с плавающей точкой}
var s1,s2:string;
begin
 if (pos('E',st)<pos('.',st)){если точка дальше Е}
  or not (st[pos('E',st)+1] in ['+','-']){или после Е нет знака + или -}
   then Prav_PT:=false
 else
  begin
   s1:=copy(st,1,pos('E',st)-1);{число до Е}
   s2:=copy(st,pos('E',st)+2,255);{число после знака + или -}
   if Prav_FT(s1)and Prav_C(s2,1) then Prav_PT:=true{первое вещественное с фикс. точкой, второе-целое}
   else Prav_PT:=false;
  end;
end;
function Prav_CH(st:string):boolean;{основная функция проверки числа}
begin
if (pos('E',st)=0)and(pos('.',st)=0)then {не вещественное, проверяем на целое}
 if Prav_C(st,1) then Prav_CH:=true
 else Prav_CH:=false
else if (pos('E',st)=0)and(pos('.',st)>0)then{может быть вещественным с фиксированной точкой}
 if Prav_FT(st)then Prav_CH:=true
 else Prav_CH:=false
else if(pos('E',st)>0)and(pos('.',st)>0) then{с плавающей точкой}
 if Prav_PT(st)then Prav_CH:=true
 else Prav_CH:=false;
end;
 
var c:char;
    s:string;
begin
clrscr;
writeln('Vvedite chislo, окончание ввода Enther:');
s:='';{пустая строка}
repeat
c:=readkey;{читаем символ}
write(c);
s:=s+c;{добавляем в строку}
until c=#13;{Enter, конец}
delete(s,length(s),1);{удалим символ #13}
writeln;
if s[1] in ['-'] then delete(s,1,1);{если первый символ минус, все нормально, удалим его}
if Prav_CH(s)then write('Это число!')
else write('Это не число!');
readln
end.
Добавлено через 1 минуту
Кстати забыл, надо в начале программы пробежаться по строке и заменить маленькие символы е на большие.
1
01.09.2009, 16:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.09.2009, 16:36
Привет! Вот еще темы с ответами:

Рекурсия - числа Фибоначчи - Pascal
Вычисление n -го чмсла фибоначчи, исходя из реккурентного определения этих чисел: каждое последующее = сумме двух предыдущих

Разложение числа на слагаемые [рекурсия] - Pascal
Привет! Пишу программу разложения числа на слогаемые, но опять хочу попросить помощи - не проходит два последних теста по лимиту...

Рекурсия. Наибольшая цифра числа. - Pascal
помогите решить задачу с помощью рекурсии (нахождение наибольшей цифры натурального числа)

Паскаль Рекурсия Возведение числа в степень - Pascal
Объясните пожалуйста. как закончить программу Program pow; Procedure Power (X: real; N: integer; var Y: real); Begin ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
23
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru