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

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> рекурсия и файл, Си
сообщение
Сообщение #1


Профи
****

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

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


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

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

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

Сообщение отредактировано: 18192123 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






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

#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;

}



Но можешь открыть файл, например, в одной функции, а потом вызвать рекурсию...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Профи
****

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

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


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

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


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

isdigit(getc(f) - это наверно ф-я, прототип которой находится в <ctype.h>? А как она работает? Каковы параметры её?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






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

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


Профи
****

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

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


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

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

А есть способ решения без макроса ( нам ещё об этом не рассказывали)?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






...
int get_count(FILE *f) {

int ch;
if(feof(f)) return 0;
return
(((ch = getc(f)) >= '0' && (ch <= '9')) ? 1 : 0) + get_count(f);
}
...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Профи
****

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

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


Цитата(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?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






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

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

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

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

 





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