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

Дисциплины:

Архитектура (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 массивы

o указатели

o ссылки

o перечисления

o указатели на члены класса.

· Составные производные типы. В группу составных производных типов входят:

o классы

o структуры

o объединения

Массивы

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

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

Статический массив:

<базовый тип><имя массива>[<размер масива>]={<список инициализации>}

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

Для обращению к элементу массива указывается имя массива, а затем в квадратных скобках индекс(номер). Индексом может быть любое целое выражение, образуемое целыми переменными и целыми константами.

Ввод и вывод массивов производится поэлементно.

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

Имя массива является указателем-переменной, память под элементы массива выделяется в куче(динамической памяти) с помощью специальной команды new.

<базовый тип>*<имя массива>= new <базовый тип>[<размерность массива>]

Указатель а хранит адрес нулевого элемента. Выражение *(а+2) говорит о том, что вначале мы сдвинемся по отношению к нулевому элементу массива а на столько байт, сколько занимает 2 элемента, а затем, обратимся к значению, которое там хранится. Освободить память, выделенную под динамический массив можно командой delete. (delete [] m)

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

Статические двумерные массивы: <базовый тип><имя массива>[число строк][число столбцов]

Динамические двумерные массивы: <базовый тип>**<имя массива>= new <базовый тип>*[<размерность массива>]обращаться можно с помощью индексации( а[i][j]), или с помощью указателей( *(*(а+i)+j))

 

 

19…Указатели, работа с указателями в С/С++.

Программист может определить свои собственные переменные для хранения адресов области памяти. Такие переменные называются указателями. В С++ различают три вида указателей: указатели на объект, на функцию, на void, которые отличаются друг от друга свойствами и допустимыми операциями. Указатель не является самостоятельным типом, он всегда связан с каким-либо другим- базовым типом. Указатели позволяют максимально эффективно решить проблему возврата нескольких значений из функции, а также возврата больших объектов, копирование которых нежелательно.

Указатель на объект содержит адрес области памяти, в которой хранятся данные определенного типа(простого или составного). Простейшее объявление указателя на объект имеет следующий вид: <базовый тип>[<модификатор>]*<имя указателя> (модификатор не обязателен и может иметь значение near(по умолчанию), far, huge).

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

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

Указатель типа void применяется в тех случаях, когда конкретный тип объекта, адрес которого нужно хранить, не определен. Указателю на void можно присвоить значение указателя любого типа, а также сравнить его с любым указателем, но перед выполнением каких-либо действий с областью памяти, на которую он ссылается, требуется преобразовать его к конкретному типу явным образом.

Перед использованием любого указателя надо выполнить его инициализацию, т.е. произвести присваивание начального значения. Способы инициализации указателя:

1)присваивание указателю адреса существующего объекта:

- с помощью операции получения адреса:(int a=50; int *x=&a; int *y(&a);)

- с помощью значения другого инициализированного указателя(int *z=x;)

- с помощью имени массива или функции;

2) присваивание указателю адреса области памяти в явном виде( int *p=(int*00xB8000000, где 0xB8000000-шестнадцатеричная константа)

3) присваивание пустого значения (int *x=NULL; int *y=0)

4) выделение участка динамической памяти и присваивание ее адреса указателю (int *a= new int; int *b=new int(50);

Очистка памяти производится операцией delete.

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

 

 

20… Строковый тип в С/С++, стандартные функции для работы со строками.

Строка – это последовательность символов определенной длины. Существуют два типа данных, кототрые используются для представления строк. Первый: строка представляет собой массив базового типа char, конец которого отмечается нулевым символом ‘\0’, строки данного типа, называемые строками С, все еще широко используются, например, строковые константы в кавычках, такие как “Hello”, реализуются в С++ как строки С.

Второй: строка представляет собой объект класс string, класс string позволяет обрабатывать строки посредством стандартных операторов С++, использовать их в составе стандартных выражений, в классе string контролируются границы массива. Для работы со строками в стиле С надо подключить заголовочный файл cstring, а для работы со строковым классом нужно подключать заголовочный файл string.

Формат объявления строки первым способом: char <имя строки>[n+1];, где n максимальное количество символов в строке. 1 прибавляется для того, чтобы строка вместила нуль-символ. При этом строка может быть заполнена не до конца.

Строковую переменную можно инициализировать при объявлении, при этом необязательно указывать ее размер.

Ввод строк: cin>> (символы будут считываться до тех пор, пока не встретится символ пробела, табуляции или перевода строки, после чего ввод прекратится)

Сin.getline(s,n) – (вводится все трока целиком(до символа перевода строки) ввод строки s, а параметр n задает максимальное количество символов в этой строке, если ввести символов больше n то лишние будут проигнорированы)

Основные операции: Обратится к символу строки можно так же кАк и к элементу обычного массива, указав имя строковой переменной и, в квадратных скобюках, индекс требуемого символа. Строки в стеле С отличаются от переменных других типов днных, и многие операции языка С++ к ним неприменимы. Нельзя использовать строковую переменную в стиле С в операторе присваивания. Чтобы присвоить значение строковой переменной в стиле С, можно воспользоваться стандартной функцией strcpy(s,”Привет”)

Или strncpy(s1,s2,10); - копирует 10 символов из строковой переменной s2(независимо от ее длины) в строковую переменную s1

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

Strchr(s,ch) – функция возвращает указатель на первое вхождение символа ch в строке s, если его нет то возвращает NULL.

Для преобразования строки с стиле С, состоящей из цифр, в число используются функиции atoi(возвращает значение типа int), atol(long), atof(float). Для использования данных функций нужно подключить зазоловочный файл «stdlib» .

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

Если первый символы строки представляют собой число указанного типа, то это число и будет возвращаться в качестве результата, а остальные символы проигнорируются.

STRING

Strong(s1) – определяет длину строки без нуля
Strstr(s1,s2) результат ук. на начало строки s2 в строке s1, если она там есть и 0 если нет.
Strcat(s1,s2) в s1 записывается результат объединения s1 и s2
Strapr(s1) преобразует строчную запись в прописную
Strlw(s1) противопоставление предыдущей
Strset(s,c,n) заменяет в строке s n символов на символ c

Класс string позволяет работать со значениями и выражениями типа string почти также как со значениями простого типа данных.

Объявление: string<имя переменной>(<значение>)

Например:

String s(“Привет”); (переменной s присваивается объект типа стринг, содержащий те же символы и в том же порядке, что и строка привет, но его значение не завершается нуль-символом ‘\0’)

Или srting s=”Привет”;

Ввод: getline(cin,s)- прекращает чтение встретив символ \n

getline(cin,s,’l’)- перкращает считывание встретив знак l

cin>>s – считывает до пробела,табуляции или перевода строки

Класс string поддерживает доступ к символам, как к элементам массива.

Но можно использовать функцию-член at ( s.at(i);) выполняет ту же функцию что и квадратные скобки, но проверяет допустим ли индекс, переданный в качестве аргумента.

s.Lenght() кол-во символов в строке

s.substr(I,sl) возвращает подстроку строки s которая начинается с позиции i и содержит n символов

s.empty() возвращает true если является пустой строкой

s.insert()вставляет в строку s строку s1, начиная с позиции i

s.erase(i,n) удаляет n символов, начиная с позиции i

s.find(sl,i) возвращает индекс первого вхождения строки s1, причемпоиск начинается с позиции i

s.rfind(sl) возвращает индекс первого справа вхождения строки s1 в стоку s

s.replace(I,n,sl) заменяет n символов строки s начиная с позиции i на подстроку s1

s.compare(sl) сравнивает s и s1

 

21… Работа со структурами и объединениями в С/С++.

Структуры, как и массивы, относятся к составным типам данных. Однако в отличие от массивов, структура может содержать элементы разных типов.

Описание: struct <имя структуры>

{<тип 1><идентификатор 1>;

<тип 2><идентификатор 2>;

<тип n><идентификатор n>;};

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

Доступ к полям структуры выполняется с помощью операций выбора: при обращении к полю через имя переменной используется операция .()точка, при обращении через указатель используется операция ->.

Структура наряду с другими членами может содержать конструктор, который используется для инициализации членов- данных структуры. Имя конструктора совпадает с именем массива. Для конструктора не указывается тип возвращаемого значения,т.к. назначение конструктора инициализировать члены-данные. В качестве параметров конструктору передаются аргументы, которые будут использоваться при инициализации. Если структура содержит конструкторы, то работа с ней возможна только через указатели. Структуры это переход т структурного программирования к объектно-ориентированному.

Объединения C++ очень похожи на структуры, за исключением того, как C++ хранит их в памяти; кроме того, объединение может хранить значение только для одного элемента в каждый момент времени. следующая структура определяет объединение с именем distance, содержащее два элемента:

union distance

{ int miles;
long meters;};

Объединение представляет собой структуру данных, подобную структуре C++, и состоит из частей, называемых элементами.

Когда вы объявляете объединение, компилятор C++ распределяет память, достаточную для хранения только самого большого элемента объединения.

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

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

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

Анонимное объединение представляет собой объединение, у которого нет имени. Когда программа объявляет анонимное объединение, она может использовать элементы такого объединения подобно любым другим переменным без точки.

Union <имя объелинения>

{<тип 1><идентификатор 1>;

<тип 2><идентификатор 2>;

<тип n><идентификатор n>;};

Различия состоят в следующем:

 

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

2. С++ : В отличие от структур С++, объединения С++ не могут использовать спецификаторы класса доступа: public, private и protected. Все поля объединения имеют доступ private.

3. Объединения инициализируются через компонент, объяв-

ленный первым

union local87 (*

int i;

double d;

*) a = (* 20*);

4. С++ : Объединение не может участвовать в иерархии

класса. Оно не может являться производным от какого-либо

класса или быть базовым классом. Объединение может иметь

конструктор.

 

5. С++ : Анонимные объединения не могут иметь компоненты-функции.

 



Просмотров 1058

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




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