Два способа для работы с динамическими переменными.
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 – указатели на первый, текущий и на предшествующий элементы соответственно.
Блок – схема:
Текст программы:
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.