IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Рекурсия, Не могу понять ошибку?!?!?!?
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 9
Пол: Мужской
Реальное имя: YUra

Репутация: -  0  +


ЛЮди!!!!!
Помогите пожалуйста разобраться:
Надо было написать программу, которая при помощи рекурсивной функции
digits определить количество цифр в заданном текстовом файле.
(Заранее надо создать в папке с прогой файл Text.txt)
Не могу понять, где ошибка(выдает результат около 42000)


program recursiya;
uses crt;
const max=10000;
type txt=text;
chr=char;
mas=array[1..max] of chr;
zn =0..max;
col=1..16;
var in_text:txt;
m_char :mas;
i,s,k :zn;
n_char:zn;
set_dig:set of '0'..'9';

procedure C(color:col);
begin
TextColor(color);
end;

function Digits(s:zn):zn;
begin
if n_char>1 then
begin
n_char:=n_char-1;
if m_char[n_char] in set_dig then
begin
Digits:=1+Digits(n_char);
end
else
begin
Digits:=Digits(n_char);
end;
end;
end;

begin
ClrScr;
set_dig:=['1'..'9'];
Assign(in_text,'Text.txt');
Reset (in_text);
i:=1;
While not EOF(in_text) do
begin
Read(in_text,m_char[i]);
C(12);
Inc(i,1);
n_char:=i;
end;
WriteLn(Digits(n_char));
readkey;
end.



Когда max например равно 10, значение функции уменьшается.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






TR@N,
разве так пишется рекурсия? blink.gif
Смысл тогда от нее какой?

Вообще-то это вот так делается:
program recursiya;
uses crt;
type txt=text;
var in_text:txt;

function Digits(var f: text): integer;
var ch: char;
begin
if eof(f) then digits := 0
else begin
read(f, ch);
Digits := byte(ch in ['0' .. '9']) + Digits(f)
end;
end;

begin
ClrScr;
Assign(in_text,'Text.txt');
Reset (in_text);

writeln(digits(in_text));

close(in_text);
end.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





Группа: Пользователи
Сообщений: 9
Пол: Мужской
Реальное имя: YUra

Репутация: -  0  +


Большое спасибо! Очень благодарен, просто впервые с ней столкнулся и плохо разобрался
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Новичок
*

Группа: Пользователи
Сообщений: 15
Пол: Мужской
Реальное имя: Денис

Репутация: -  -1  +


Volvo,
нихорошо нерабочий код писать.

Если я правильно понял задачу то:
вообще-то это вот так делается:


Program recursiya;
Uses Crt;
Var F:Text;

Function Digits:Integer;
Var c:Char;
Begin
Digits:=0;
While Not EOF(F) Do
Begin
Read(F,c);
If c in ['0'..'9'] Then Digits:=Digits+1;
End;
End;

Begin
ClrScr;
Assign(F,'text.txt');
Reset(F);
WriteLn(Digits);
Close(F);
ReadKey;
End.

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Den64, минус тебе - за клевету!!! Ясно? ЗАПОМНИ РАЗ И НАВСЕГДА! Я никогда не пишу сюда код, не проверив его минимум на 3-х тестах!!! А если пишу, то предупреждаю, что набиваю прямо здесь!

А теперь у тебя есть 1 (один) час, чтобы привести мне пример НЕправильной работы моего кода. Иначе улетишь в бан. За нарушение правил форума. Каких - сам догадайся... Я тебе приведу контрпример в течении 10 секунд!

Время пошло!
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 15
Пол: Мужской
Реальное имя: Денис

Репутация: -  -1  +


Я конечно не очень дотошный но переменные нужно обнулять. Программа из-за этого выдала неверный результат.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Какие переменные? У меня простите ХВОСТОВАЯ (!!!) рекурсия (заметь, по правилам, в отличие от твоей, оформленная, с условием выхода из рекурсии), и как только достигнут конец файла, Digits обнуляется (ОДИН раз, как и положено!!!).

Насчет неверного результата:
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Новичок
*

Группа: Пользователи
Сообщений: 15
Пол: Мужской
Реальное имя: Денис

Репутация: -  -1  +


У меня просто сразу не правильно сработала и я подумал что код не правильный.
Вообшето был не прав.
Приношу свои извенения.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Какие переменные? У меня простите ХВОСТОВАЯ (!!!) рекурсия (заметь, по правилам, в отличие от твоей, оформленная, с условием выхода из рекурсии), и как только достигнут конец файла, Digits обнуляется (ОДИН раз, как и положено!!!).

Насчет неверного результата:
Это - результат запуска в Free Pascal Compiler
Прикрепленное изображение

Это - Турбо Паскаль 7.0
Прикрепленное изображение

По 3 разных теста в обоих случаях - ни одной ошибки! Ты считаешь себя умнее двух компиляторов?

Прогони программу:
Прикрепленный файл  recurs.rar ( 397 байт ) Кол-во скачиваний: 372
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 23.12.2024 20:28
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name