Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
0495976_C19D7_shpory_s.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
1.82 Mб
Скачать

Массивы структур

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

Например, имеется два разнотипных массива:

char c[N];

int i[N];

Объявление

struct key

{char c;int i;} keytab[N];

создает тип структуры key и объявляет массив keytab[N], каждый элемент которого есть структура типа key.

Возможна запись:

struct key{char c;int i;};

struct key keytab[N];

Инициализация массива структур выполняется следующим образом:

struct key

{char c;int i;} keytab[]={'a', 0,'b', 0};

В этом примере создается массив на две структуры типа key с именем keytab. Рассмотрим обращение к полю структуры в этом случае – для примера выведем на экран содержимое массива:

for(int i=0;i<2;i++)

printf("%c %d\n",keytab[i].c,keytab[i].i);

При обращении к полю структуры сначала происходит обращение к элементу массива (keytab[i]), а затем только обращение к полю структуры (keytab[i].c).

Доступ к полю элемента массива структур может быть получен через константу-указатель на массив и смещение внутри массива, например, доступ к полю элемента массива с номером i следует записать следующим образом:

(*(keytab+i)).c или (keytab+i)→ c.

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

Пример программы, в которой массив точек формируется и выводится на экран с помощью функций:

#include <stdio.h>

#define N 5

struct point

{int x,y;};

void form_mas(struct point* mas, int n)

{printf("Enter koordinates!\n");

for(int i=0;i<n;i++)

{printf("x→");

scanf("%d",&mas[i].x);

printf("y→");

scanf("%d",&mas[i].y);}}

void print_mas(struct point* mas, int n)

{

printf(" x  y\n");

for(int i=0; i<n; i++)

printf("%4d %6d\n",(mas+i)→x,(mas+i)→y);

}

int main()

{

struct point Points[N];

form_mas(Points,N);

print_mas(Points,N);

return 0;

}

Функция form_mas() заполняет массив точек, который передан в функцию через указатель mas. Параметр функции n определяет количество элементов массива. Доступ к элементу массива – через операцию . (точка). Выражение &mas[i].x вычисляет адрес элемента структуры mas[i].x, так как операция & имеет более низкий приоритет, чем операции [] и · (точка).

Функция print_mas() выводит массив на экран. Передача массива в функцию происходит также через указатель mas. Параметр n – количество элементов массива. Доступ к элементу массива – через операцию → (стрелка).

26.Класс, объектами которого являются множества.

Таким классом является встроенный в язык класс std::set

Реализует шаблоны классов контейнеров std::set и std::multiset — сортированные ассоциативные контейнеры или множества.

Ассоциативный контейнер set-упорядоченное множество уникальных элементов. При вставке/удалении элементов множества итераторы, указывающие на элементы этого множества, не становятся недействительными. Обеспечивает стандартные операции над множествами типа объединения, пересечения, вычитания. Тип элементов множества должен реализовывать оператор сравнения operator< или требуется предоставить функцию-компаратор. Реализован на основе самобалансирующего дерева двоичного поиска. multiset То же что и set, но позволяет хранить повторяющиеся элементы

Контейнер (container) — хранение набора объектов в памяти.

Итератор (iterator) — обеспечение средств доступа к содержимому контейнера.

Пример:

iterator begin ();

const_iterator begin () const;

Возвращает итератор, указывающий на первый элемент в множестве контейнера.

/ set::begin/end

#include <iostream>

#include <set>

using namespace std;

int main ()

{

int myints[] = {75,23,65,42,13};

set<int> myset (myints,myints+5);

set<int>::iterator it;

cout << "myset contains:";

for ( it=myset.begin() ; it != myset.end(); it++ )

cout << " " << *it;

cout << endl;

return 0;

}

27.Классы (fstream, ofstream, ifstream, ostream, istream, ios) и представители классов потокового ввода-вывода.

Подклассы ofstream, ifstream и fstream объявлены в заголовочном файле

fstream.n и обеспечивают потоки ввода-вывода в дисковые файлы. Эти три класса

предоставляют множество функций для управления вводом и выводом, многие из ко-

торых наследуются от ostream и istream. Полный список этих функций вы можете

найти в документации к компилятору

Класс ofstream, который используется для файлового вывода, имеет несколько

конструкторов; наиболее часто применяется следующий:

ofstream::ofstream(char* pFileName,

int mode = ios::out,

int prot = filebuff::openprot);

Класс ifstream работает для ввода почти так же, как ofstream для вывода, что

и демонстрирует приведенный ниже пример.

#include <fstream.h>

Класс fstream похож на комбинацию классов ifstream и ofstream (кстати, он

и наследуется от обоих этих классов). Объект класса fstream может быть создан как

для ввода, так и для вывода.

Классы istrstream, ostrstream и strstream определены в заголовочном файле

с именем strstrea.h или strstream.h.

Классы из strstream.h позволяют использовать операции, определенные для

файлов в классах fstream, для строк в памяти. Это очень похоже на функции

sprintfO Hsscanf() в С.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]