Два способа для работы с динамическими переменными.

1. Резервирование памяти под дин. переменные производится с помощью операции new <тип>; где <тип>, - тип динам. переменной; new, - знак операции. Результат операции – адрес области памяти (указатель); операнд – любой тип в TC.

Пример:

float *p;

p=new float;

*p, - динамическая переменная.

Резервирование памяти под динамические переменные – “захват”.

<освобождение памяти>≡delete <выр.>.

Выражение должно иметь тип указатель.

Динамические массивы.

Динамические массивы – массивы, под которые выделяется область памяти “куча”. Работать с такими массивами так же, как и с динамическими переменными.

Резервирование памяти производится с помощью операции new <тип> []. Результат операции – адрес области памяти (указатель); операнд – любой тип в TC.

Пример:

a=new float [10], - захват памяти под 10 элементов действительного типа; значение a – указатель; работа с такими массивами так же, как и со статичными.

<освобождение памяти>≡delete [] <выражение>; при этом выражение должно иметь значение указателя на динамический массив.

NULL, - отсутствие ссылки; принадлежит любому значению типа указатель.

Списки.

Teg – описание структуры.

<определение типа структура с помощью тега>≡

struct <идент.>

{

<резервирование памяти>;

{< резервирование памяти >;}

};

Пример: Определим тип элемента односвязного списка.

struct tinfo

{

float x, y;

}

struct tel

{

tinfo info;

tel *link;

}

typedef tel* ptel;

Организация односвязного списка по принципу ссылки вперед.

Пример:

b, t, p – указатели на первый, текущий и на предшествующий элементы соответственно.

Блок – схема:

Два способа для работы с динамическими переменными. - student2.ru

Текст программы:

void VVKL (ptel &b, int &n)

{

ptel t, p;

n=0;

do

{

t=new tel;

n++;

cout<<”Znachenie pervogo chlena ? ”;

cin>>t->info.x;

cout<<” Znachenie vtorogo chlena ? ”;

cin>>t->info.y;

if (n==1) b=t; else p->link=t;

p=t;

}

while (printf(“Prodolgit’ vvod? y/n ? ”)&&getchar()==’y’);

t->link=NULL;

}

Файлы.

Файл – упорядоченная совокупность произвольного числа компонентов, расположенная на внешнем запоминающем устройстве, и имеющая имя, называемое физическим именем файла. В программе файлу соответствует внутреннее логическое имя файла <идент.>. На языке С файл имеет сложную организацию и рассматривается как структура.

Работа с файлами в С реализуется через буфер. В С существует два вида файлов: текстовые и бинарные (двоичные). Текстовый – это файл, содержащий текстовые данные, как правило, организованные в виде строк. Бинарный (двоичный) – это файл, содержащий последовательность произвольных байтов. Байты состоят из бит, т.е. двоичных цифр. Текстовые файлы являются частным случаем двоичных файлов, и, таким образом, в широком значении слова под определение «двоичный файл» подходит любой файл.

Внутреннее логическое имя файла <идент.> должно быть объявлено в программе:

<резерв. памяти под указатель на буфер файла>≡FILE* <идент.>

Например:

FILE *prfl;

после объявления имя prfl будет являться указателем на некоторый файл.

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

1.Прежде чем читать файл или записывать в него информацию, его необходимо открыть с помощью библиотечной функции:

<открытие файла >≡fopen(“<имя файла>; <атрибут файла>”)

атрибуты: w - чтение, r - запись, q;

значение функции – указатель на буфер.

<идент.>≡fopen (“имя файла”, “<атрибут>”); - связывает имя файла с буфером.

Для работы с существующим файлом можно использовать следующую структуру

if ((<идент.>=fopen(“<имя файла>”,”r”))!=NULL)

{

//работа с файлами//

}

else

cout<<”fayl ne nayden”<<endl;

2. После окончания работы с файлом он должен быть закрыт с помощью функции:

<закрытие файла >≡fclose(<идент>)

Она возвращает значение 0, если файл закрыт успешно, и ненулевое значение в противном случае.

Функции 1 и 2 работают с текстовыми файлами с буферизацией. Под буферизацией понимается то, что вводимые и выводимые данные запоминаются во временно области памяти, называемой буфером. Функция fclose() позволяет освободить частично заполненный буфер при закрытии файла, иначе информация может быть потеряна.

3.Функции форматированного ввода и вывода в файл имеют следующий вид: <форматированный вывод в файл>≡fprintf(<идент.>,<шаблон вывода>,<список вывода>);

<форматированный ввод из файла>≡fscanf(<идент.>,<шаблон вывода>,<список вывода>)

Действие этих функции аналогично действию функций scanf() и printf(), но здесь дополнительно вводится указатель на файл <идент.>, который в отличие от предыдущих функций используется в качестве первого аргумента.

getc(), - функция, считывающая символ, на который указывает указатель чтения.

Пример:

getc()!=EOF.

Наши рекомендации