Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции Грибановой по ОП.docx
Скачиваний:
19
Добавлен:
11.05.2015
Размер:
52.52 Кб
Скачать

Рекурсивные функции

Рекурсивные определения и рекуррентные вычислительные схемы довольно часто используются в математике. Например:

n! = n*(n-1)! //рекурсивное определение факториала

yn+1=0.5*(yn+x/yn) //итерационная формула метода Ньютона

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

Наиболее часто цитируемым примером рекурсивной программы является вычисление факториала:

long fact(int n)

{ if (n<2) return 1;

return (n*fact(n-1));}

Работа с файлами Текстовые (строковые) файлы

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

Текстовые файлы относятся к файлам последовательного доступа, т.к. единицей хранения информации в них являются строки переменной длины. Каждая строка заканчивается специальным признаком, обычно его функцию выполняет пара символов 0D0A – "возврат каретки" и "перевод строки". Самым важным преимуществом текстовых файлов является универсальность формата хранения информации – числовые данные в символьном виде доступны на любом компьютере, при необходимости их может прочитать и человек. Однако это преимущество имеет и обратную сторону медали – преобразование числовых данных из машинных форматов в символьный вид при выводе и обратное преобразование при вводе сопряжено с дополнительными расходами. Кроме того, объем числовых данных в символьном формате занимает в несколько раз больше памяти по сравнению с их машинным представлением.

Текстовый файл может быть создан путем записи на диск символьных и/или числовых данных по заданному формату с помощью оператора fprintf. В качестве признака конца строки здесь заносятся те же самые байты 0D0A, которые появляются на диске в результате вывода управляющего символа \n.

Для инициализации текстового файла необходимо завести указатель на структуру типа FILE и открыть файл по оператору fopen в одном из нужных режимов – "rt" (текстовый для чтения), "wt" (текстовый для записи), "at" (текстовый для дозаписи в уже существующий набор данных):

FILE *f1;

.........

f1=fopen(имя_файла, "режим");

Формат оператора обмена с текстовыми файлами мало чем отличается от операторов форматного ввода ( scanf ) и вывода ( printf ). Вместо них при работе с файлами используются функции fscanf и fprintf, у которых единственным дополнительным аргументом является указатель на соответствующий файл:

fscanf(f1,"список_форматов", список_ввода);

fprintf(f1,"список_форматов \n",список_вывода);

Если очередная строка текстового файла формируется из значения элементов символьного массива str, то вместо функции fprintf проще воспользоваться функцией fputs(f1, str). Чтение полной строки из текстового файла удобнее выполнить с помощью функции fgets(str,n,f1). Здесь параметр n означает максимальное количество считываемых символов, если раньше не встретится управляющий байт 0A.

Библиотека C предусматривает и другие возможности для работы с текстовыми файлами – функции open, create, read, write.

Пример. Рассмотрим программу, которая создает в текущем каталоге (т.е. в каталоге, где находится наша программа) текстовый файл с именемmassи записывает в него значения, введенные с клавиатуры (10 значений). Для контроля содержимое записываемых строк и содержимое считанных строк дублируется на экране.

#include <iostream>

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#include <conio.h>

using namespace std;

int main( )

{

FILE *Ptr;

if((Ptr=fopen("mass.txt","wt"))=NULL){

cout<<"File could not be opened."<<endl;

}

else{

int value;

FILE *Ptr;

Ptr=fopen("mass.txt","w");

printf("Enter value: \n");

scanf("%d",&value);

for(int i=0;i<10;i++){

fprintf(Ptr,"%d",value);

scanf("%d",&value);

}

fclose(Ptr);

} //конец else

}