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

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

30.08.2009, 23:04. Просмотров 2477. Ответов 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):

Функция проверки правильности ввода
мне нужна функция проверяющая правильность ввода данных с клавиатуры...

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

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

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

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

Рекурсия: определение максимального элемента вектора
Помогите решить задачи на тему рекурсия Без использования циклов 1.const...

22
TAVulator
3950 / 1109 / 160
Регистрация: 27.07.2009
Сообщений: 3,457
31.08.2009, 00:23 #2
Цитата Сообщение от SorryItsGg Посмотреть сообщение
число надо вводить посимвольно ...надо чтобы была рекурсивная функция
вот программа с рекурсивной ф-цией. проверяет каждый введенный символ, и если очередной символ не является цифрой, то сразу пишет FALSE:
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
uses crt;
var
 A: char;
 
Function ch:boolean;
var
 c:char;
Begin
 c:=readkey;
 write(c);
 if (c<>#13) then
  if (c in ['0'..'9']) then
    ch:=ch() else
    Begin
     c:=#13;
     ch:=false;
    End;
End;
 
Begin
 write('Вводите: ');
 A:=readkey;
 write(A);
 if A in ['-','0'..'9'] then
  if not ch then
   Begin
    writeln;
    Writeln('FALSE')
   End else
   Begin
    writeln;
    writeln('TRUE');
   End else
  Begin
   writeln;
   writeln('FALSE');
  End;
 A:=readkey;
End.
1
Puporev
Модератор
54138 / 41771 / 28880
Регистрация: 18.05.2008
Сообщений: 98,317
31.08.2009, 10:25 #3
надо определить является ли заданая строка правильной записью числа
В соответствии с заданием нужна рекурсивная функция проверки является ли введенная строка числом, или нет. Правильность ввода символов проверять не нужно, иначе у нас всегда будет число.
Потом конструкция
ch:=ch() else
явно не паскалевская
0
dim-hj
28 / 25 / 1
Регистрация: 28.07.2009
Сообщений: 109
31.08.2009, 10:43 #4
Цитата Сообщение от Puporev Посмотреть сообщение
конструкция ch:=ch() явно не паскалевская
Неправда.
0
Puporev
Модератор
54138 / 41771 / 28880
Регистрация: 18.05.2008
Сообщений: 98,317
31.08.2009, 10:59 #5
Неправда.
Наберите программу и попробуйте откомпилировать в Турбо Паскале.
В этой строке Вам напишут Error 85 Вставьте точку с запятой после второго ch.

Добавлено через 8 минут
Просто скобки нужно убрать.
0
TAVulator
3950 / 1109 / 160
Регистрация: 27.07.2009
Сообщений: 3,457
31.08.2009, 11:04 #6
Цитата Сообщение от Puporev Посмотреть сообщение
Потом конструкция
ch:=ch() else
явно не паскалевская
писал на Free Pascal. в задании не написано, что нужно использовать именно Турбо Паскаль.

Добавлено через 4 минуты
Цитата Сообщение от Puporev Посмотреть сообщение
В соответствии с заданием нужна рекурсивная функция проверки является ли введенная строка числом, или нет.
в задании написано:
Цитата Сообщение от SorryItsGg Посмотреть сообщение
число надо вводить посимвольно
вот я и сделал рекурсивную ф-цию ввода числа по символьно.
Цитата Сообщение от Puporev Посмотреть сообщение
Правильность ввода символов проверять не нужно, иначе у нас всегда будет число.
ну попробуй в моей программе ввести не число - получишь FALSE.
0
Puporev
Модератор
54138 / 41771 / 28880
Регистрация: 18.05.2008
Сообщений: 98,317
31.08.2009, 11:08 #7
ну попробуй в моей программе ввести не число - получишь FALSE.
Суть ведь не в этом. Сначала надо ввести строку, а потом проверить, число это или нет, а не в процессе ввода это делать.
0
schdub
Эксперт С++
3016 / 1361 / 415
Регистрация: 19.01.2009
Сообщений: 3,615
Завершенные тесты: 1
31.08.2009, 11:23 #8
Цитата Сообщение от Puporev Посмотреть сообщение
ch:=ch() else
явно не паскалевская
Полностью согласен. Копмиляторы паскаля, придерживающиеся стандарта, просто-напросто неоткомпилят данный код.
0
schdub
Эксперт С++
3016 / 1361 / 415
Регистрация: 19.01.2009
Сообщений: 3,615
Завершенные тесты: 1
31.08.2009, 11:29 #9
TAVulator, а что +10, например, не стандартная запись числа? Ваша прога учитывает только отрицательные числа.
0
TAVulator
3950 / 1109 / 160
Регистрация: 27.07.2009
Сообщений: 3,457
31.08.2009, 11:51 #10
Цитата Сообщение от polivets Посмотреть сообщение
TAVulator, а что +10, например, не стандартная запись числа? Ваша прога учитывает только отрицательные числа.
по умолчанию, на сколько помню, перед положительными числами знак "+" не ставится. Но если так уж сильно хочется, то в коде строку 24 замени на это:
Pascal
1
if A in ['+','-','0'..'9'] then
0
schdub
Эксперт С++
3016 / 1361 / 415
Регистрация: 19.01.2009
Сообщений: 3,615
Завершенные тесты: 1
31.08.2009, 11:59 #11
Цитата Сообщение от TAVulator Посмотреть сообщение
по умолчанию, на сколько помню, перед положительными числами знак "+" не ставится. Но если так уж сильно хочется, то в коде строку 24 замени на это:
Это и так понятно (лично для меня), а вот понятно ли это автору данной темы?

Думаю, у автора, все же, нужно узнать, как в его лабе, понимается правильная записью числа, перед тем, как что-то писать. Ведь для меня, например, вполне нормальной является запись 0xabcdef00, а как должно быть в его программе? - простор для фантазии, поражденный расплывчатыми фразами.
0
SorryItsGg
0 / 0 / 0
Регистрация: 30.08.2009
Сообщений: 11
31.08.2009, 12:42  [ТС] #12
простите меня за мою глупость пожалуйсто но у меня есть 1 вопрос я переписал эту программу в паскаль со всеми вашими исправлениями но когда пытаюсь компилировать возникает ошибка в строке
с:=readkey;
ошибка вот такая 3:Unknow indetifier
0
Puporev
Модератор
54138 / 41771 / 28880
Регистрация: 18.05.2008
Сообщений: 98,317
31.08.2009, 12:58 #13
Подключите модуль Crt; В начале программы, а если есть строка Program aaaa;, то после нее
Uses Crt;
1
SorryItsGg
0 / 0 / 0
Регистрация: 30.08.2009
Сообщений: 11
31.08.2009, 12:58  [ТС] #14
Цитата Сообщение от polivets Посмотреть сообщение

Думаю, у автора, все же, нужно узнать, как в его лабе, понимается правильная записью числа, перед тем, как что-то писать. Ведь для меня, например, вполне нормальной является запись 0xabcdef00, а как должно быть в его программе? - простор для фантазии, поражденный расплывчатыми фразами.
Вот : число может быть представлено либо в виде числа с фиксированной десятичной точкой (-214.78), либо в виде числа с плавающей точкой десятичной точкой(-2.1478E+02).
0
Puporev
Модератор
54138 / 41771 / 28880
Регистрация: 18.05.2008
Сообщений: 98,317
31.08.2009, 13:01 #15
Вот : число может быть представлено либо в виде числа с фиксированной десятичной точкой (-214.78), либо в виде числа с плавающей точкой десятичной точкой(-2.1478E+02).
А сразу написать нормальное условие влом? И чего Вы ждете от людей? Думаю Вам сейчас прямая дорога в раздел Фриланс.
0
SorryItsGg
0 / 0 / 0
Регистрация: 30.08.2009
Сообщений: 11
31.08.2009, 13:30  [ТС] #16
Искрене прошу прощения....сразу не подумал....еще раз извините
0
Puporev
Модератор
54138 / 41771 / 28880
Регистрация: 18.05.2008
Сообщений: 98,317
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 / 160
Регистрация: 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 / 1
Регистрация: 28.07.2009
Сообщений: 109
01.09.2009, 08:05 #19
Цитата Сообщение от polivets Посмотреть сообщение
Полностью согласен. Копмиляторы паскаля, придерживающиеся стандарта, просто-напросто неоткомпилят данный код.
Turbo и Free весьма далеки от стандартов.

Delphi, мне кажется, скомпилировала бы этот код. Проверить пока негде.
0
Puporev
Модератор
54138 / 41771 / 28880
Регистрация: 18.05.2008
Сообщений: 98,317
01.09.2009, 08:24 #20
Delphi, мне кажется, скомпилировала бы этот код. Проверить пока негде.
Так и Free Pascal компилирует структуры типа ch(). Турбо Паскаль не компилирует. Делфи тоже компилирует, я все проверил. Во Free Pascal вообще много делфийских фишек.
Просто подавляющее большинство авторов в этом разделе юзают Турбо Паскаль 7.0, реже 7.1.
Просто код написанный для Турбо, компилируется в Фрее, наоборот-нет.
0
01.09.2009, 08:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.09.2009, 08:24
Привет! Вот еще темы с решениями:

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

Рекурсия - числа Фибоначчи
Вычисление n -го чмсла фибоначчи, исходя из реккурентного определения этих...

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

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


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

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

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