Главная Обратная связь

Дисциплины:

Архитектура (936)
Биология (6393)
География (744)
История (25)
Компьютеры (1497)
Кулинария (2184)
Культура (3938)
Литература (5778)
Математика (5918)
Медицина (9278)
Механика (2776)
Образование (13883)
Политика (26404)
Правоведение (321)
Психология (56518)
Религия (1833)
Социология (23400)
Спорт (2350)
Строительство (17942)
Технология (5741)
Транспорт (14634)
Физика (1043)
Философия (440)
Финансы (17336)
Химия (4931)
Экология (6055)
Экономика (9200)
Электроника (7621)






Работа с файлами последовательного и произвольного доступа



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

Что касается структур данных, то она (структура данных) подразумевает последовательный доступ, если за каждый конкретный момент времени можно обратиться лишь к одному элементу структуры, причем доступ к элементам происходит в определенном порядке. Каноническим примером служит связанный список. Индексация в списке с последовательным доступом требует O(k) времени, где k - индекс. В результате, многие алгоритмы, такие как быстрая сортировка и двоичный поиск вырождаются в малопригодные алгоритмы, которые еще менее эффективны, чем их упрощенные альтернативы; эти алгоритмы бесполезны без произвольного доступа. С другой стороны, некоторые алгоритмы, обычно те, которые не выполняют индексацию, требуют только последовательный доступ, как например, сортировка слиянием, что позволяет избавиться от указанных проблем.

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

Говорят, что структура данных поддерживает произвольный доступ если возможен доступ к любому элементу за константное время O(1)по отношению к количеству элементов, хранящихся в ней. Немногие структуры данных могут это обеспечить, только массивы (и сходные структуры, такие как динамический массив). Поддержка произвольного доступа структурой данных является критичным для реализации многих алгоритмов (например, для быстрой сортировки и двоичного поиска).

 

Переменные

Переменная — это именованный участок памяти, в котором хранится значение, которое может быть изменено программой. Все переменные перед их использованием должны быть объявлены. Общая форма объявления[1] имеет такой вид:

тип список_переменных;

Здесь тип означает один из базовых или объявленных программистом типов (если необходимо — с одним или несколькими спецификаторами), а список_переменных состоит из одного или более идентификаторов, разделенных запятыми. Ниже приведены примеры объявлений:



int i,j,l;short int si;unsigned int ui;double balance, profit, loss;

Необходимо помнить, что в С имя переменной никогда не определяет ее тип.

Где объявляются переменные

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

Локальные переменные

Переменные, объявленные внутри функций, называются локальными переменными. В некоторых книгах по С они называются динамическими переменными[2]. В этой книге используется более распространенный термин локальная переменная. Локальную переменную можно использовать только внутри блока, в котором она объявлена. Иными словами, локальная переменная невидима за пределами своего блока. (Блок программы — это описания и инструкции, объединенные в одну конструкцию путем заключения их в фигурные скобки.)

Локальные переменные существуют только во время выполнения программного блока, в котором они объявлены, создаются они при входе в блок, а разрушаются — при выходе из него. Более того, переменная, объявленная в одном блоке, не имеет никакого отношения к переменной с тем же именем, объявленной в другом блоке.

Чаще всего блоком программы, в котором объявлены локальные переменные, является функция. Рассмотрим, например, следующие две функции:

void func1(void){ int x; x = 10;}void func2(void){ int x; x = -199;}

Целая переменная х объявлена дважды: один раз в func1() и второй — в func2(). При этом переменная х в одной функции никак не связана и никак не влияет на переменную с тем же именем в другой функции. Это происходит потому, что локальная переменная видима только внутри блока, в котором она объявлена, за пределами этого блока она невидима.



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

Из соображений удобства и в силу устоявшейся традиции все локальные переменные функции чаще всего объявляются в самом начале функции, сразу после открывающейся фигурной скобки. Однако можно объявить локальную переменную и внутри блока программы (блок функции — это частный случай блока программы). Например:

void f(void){ int t; scanf("%d%*c", &t); if(t==1) { char s[80]; /* эта переменная создается только при входе в этот блок */ printf("Введите имя:"); gets(s); /* некоторые операторы ... */ } /* здесь переменная s невидима */}

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

Объявление переменных внутри блока программы помогает избежать нежелательных побочных эффектов. Переменная не существует вне блока, в котором она объявлена, следовательно, "посторонний" участок программы не сможет случайно изменить ее значение.

 

93. Символьные массивы и строковые функции

Хотя языки С и C++ поддерживают тип данных char, в переменных этого типа могут храниться только одиночные символы, но не строки текста. Если в программе необходимо работать со строками, их можно создавать как массивы символов.

В таком массиве для каждого символа строки отводится своя ячейка, а последний элемент содержит символ конца строки — \0. В следующем примере создаются три символьных массива. Массив szvehicle1 заполняется символ за символом с помощью оператора присваивания. Данные в массив szvehicle2 заносятся с помощью функции scanf(), а массив szvehicle3 инициализируется константной строкой.

Эта программа на языке С демонстрирует работу с массивами символов.

#include ‹stdio.h›

main() { char szvehiclel[7], /* машина

*/ szvehicle2[8];

/* самолет */ static char szvehicleS[8] = "корабль";

/* корабль */ szvehiclel[0] = 'м' szvehiclel[1] = 'a' szvehiclel [2] = 'ш' szvehiclel[3] = 'и' szvehiclel[4] = 'н' szvehiclel[5] = 'a' szvehiclel[6] = '\0';

printf ("\n\n\tВведите слово -—> самолет ") ;

scanf("%s",szvehicle2);

printf("%s\n",szvehiclel);

printf("%s\n",szvehicle2);

printf("%s\n",szvehicle3);

return(0); }

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

static char szvehicleS[8]= {'к','о','р','а','б','л','ь','\0'};

Разница заключается в том, что здесь необходимо явно указывать символ конца строки, тогда как в применяемом в программе способе добавление данного символа происходит автоматически. Объявление массива можно записать также следующим образом:

static char szvehicleS[] = "корабль";

При этом размер массива определяется компилятором автоматически. Часто содержимое массива запрашивается у пользователя с помощью функции scanf( ) , как в случае с массивом szvehicle2.

 


Эта страница нарушает авторские права

allrefrs.ru - 2019 год. Все права принадлежат их авторам!