Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ рекурсия и файл

Автор: 18192123 18.04.2007 18:29

Дан текстовый файл. Определить сколько в нем содержится цифр.
Программа должна содержать итеративную и рекурсивную функции, и не должна иметь глобальных переменных.

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

какое условие нужно задавать для нахождения цифр?

Автор: volvo 18.04.2007 19:28

Не знаю, зачем здесь НЕрекурсивная функция, если вполне можно обойтись одной рекурсией:

#include <stdio.h>
#include <ctype.h>

int get_count(FILE *f) {

if(feof(f)) return 0;
return
(isdigit(getc(f)) ? 1 : 0) + get_count(f);

}
int main() {

FILE *f;
if((f = fopen("test.txt", "rt")) == NULL) {
printf("Cannot open input file.\n");
return 1;
}

printf("%d", get_count(f));
fclose(f);

return 0;

}



Но можешь открыть файл, например, в одной функции, а потом вызвать рекурсию...

Автор: 18192123 18.04.2007 20:21

Цитата(volvo @ 18.04.2007 16:28) *

Не знаю, зачем здесь НЕрекурсивная функция, если вполне можно обойтись одной рекурсией
Но можешь открыть файл, например, в одной функции, а потом вызвать рекурсию...


Тогда, наверное, имелось ввиду написать две ф-ции, которые будут выполнять задание, только одна рекурсивно, а другая итеративно, и пользователь может выбрать один из этих способов.

isdigit(getc(f) - это наверно ф-я, прототип которой находится в <ctype.h>? А как она работает? Каковы параметры её?

Автор: volvo 18.04.2007 20:28

isdigit это не функция, а макрос, описанный в ctype.h. Он принимает символ, и возвращает 0, если это НЕ цифра (от '0' до '9'), и ненулевое значение, если цифра...

А функция getc(f) читает из потока f очередной символ, и возвращает его как результат... Описана в stdio.h, как и все остальное для работы с файлом...

Автор: 18192123 18.04.2007 21:31

Цитата(volvo @ 18.04.2007 17:28) *

isdigit это не функция, а макрос...

А есть способ решения без макроса ( нам ещё об этом не рассказывали)?

Автор: volvo 18.04.2007 21:54

...
int get_count(FILE *f) {

int ch;
if(feof(f)) return 0;
return
(((ch = getc(f)) >= '0' && (ch <= '9')) ? 1 : 0) + get_count(f);
}
...

Автор: 18192123 22.04.2007 22:14

Цитата(volvo @ 18.04.2007 16:28) *



#include <stdio.h>
#include <ctype.h>

int get_count(FILE *f) {

if(feof(f)) return 0;
return
(isdigit(getc(f)) ? 1 : 0) + get_count(f);

}
int main() {

FILE *f;
if((f = fopen("test.txt", "rt")) == NULL) {
printf("Cannot open input file.\n");
return 1;
}

printf("%d", get_count(f));
fclose(f);

return 0;

}





а почему главная ф-я возвращает 0 и почему при if((f = fopen("test.txt", "rt")) == NULL) возвращается 1?

Автор: volvo 22.04.2007 23:39

Потому, что обычно ноль - это признак безошибочного завершения программы, а если файл не открылся - это ошибка... Вот и возвращаем код ошибки...

Можно, например, при всех неудачах с открытием файла возвращать 1, при неудачах создания файла - возвращать 2, при ошибке, скажем, записи в файл, возвращать 3, ну и т.д.

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