Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по С++.doc
Скачиваний:
27
Добавлен:
20.08.2019
Размер:
2.26 Mб
Скачать

Составные типы данных

Составные типы данных определяют наборы однотипных или разнотипных компонентов. В языке VC++2005 следующие составные типы:

  1. Массивы.

  2. Строки.

  3. Структуры.

  4. Объединения.

  5. Перечисления.

  6. Файлы.

Обработка массивов в VC++

Массив состоит из определенного количества компонентов одного и того же типа. Компоненты могут быть простыми и составными. Доступ к каждому элементу массива осуществляется с помощью индексирования. Индексом может быть произвольное выражение порядкового типа, заключенное в квадратные скобки. Допустимый диапазон индексов определяется в описании массива. Чтобы создать массив необходимо указать три параметра:

  • Тип значений каждого элемента.

  • Имя массива.

  • Количество элементов в массиве.

Формат объявления массива:

Тип идентификатор_массива [количество элементов];

Пример:

int x[100]; //в ОП по адресу х выделяется участок размером 100 умноженное на размер типа int, 4 байта.

float a[200]; //в ОП по адресу a выделяется участок размером 200 умноженное на размер типа float, 4 байта.

Размер массива можно определить:

Число_байтов = sizeof (тип_элемента) * число элементов;

Количество элементов можно определить:

Кол._элем. = sizeof (имя_массива) / sizeof (тип_элемента);

Обязательные условия при объявлении массива:

  • Размерность – это целое положительное константное выражение.

  • Тип элемента в одномерном массиве – простой (скалярный).

  • Количество элементов обязательно надо указать в одномерном массиве, если не проводится инициализация.

  • В массиве каждый элемент обрабатывается отдельно.

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

Пример индексации элементов массива

array [ 2 ] ; // третий элемент массива array

a [ i + 2 ] ; // (i + 2)-ий элемент массива a

  • Каждому элементу одномерного массива соответствует один индекс.

  • Одномерный массив имеет одну меру измерения, в нем может быть n элементов, использовать можем k элементов, где n>=k. Каждый элемент стоит на i‑том месте, где i изменяется от 0 до k. Т.Е. 0<=I <= k, где k<=n. Компилятор не контролирует значение индексной переменной, это необходимо делать внутри программы.

Основные операции над массивом – инициализация.

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

Это можно выполнить в трех случаях:

1. во время объявления;

2. во время присвоения каждому элементу конкретное значение;

3. во время считывания с устройства в/в по адресу элемента массива.

1 случай: инициализация выполняется во время объявления массива по формату: тип имя_массива [ N ] = { элемент0,…,элементN-1};

Пример инициализации одномерного массива простого типа в момент объявления массива

int m [ 3 ] = { 1, 10, 100 } ; //нулевой элемент равен 1, первый – 10. второй – 100.

unsigned short x [ 5 ] = { 3, 5 } ; // нулевой элемент равен 3; первый – 5; элементы, значения которых не указаны, обнуляются, т.е.второй, третий и четвертый элементы равны 0.Чтобы обнулить все элементы массива, достаточно при объявлении массива, нулевому элементу присвоить нуль

int mas [10] = {0};

double y [ ] = { 1.5, 7.38, -8.9, 0.0, 10.5 } ; //в квадратных скобках не указано количество элементов, оно определяется по количеству элементов в фигурных скобках.

char c [ 4 ] = { 'a', 'b', 'c', '\0' } ;

Пример поиска минимального элемента в одномерном массиве простого типа

#include <iostream>

using namespace std ;

int main ( )

{

// объявление и инициализация массива array

int array [ ] = { 5, -10, 123, -7, 25, -3, -77, 1, 7, 3 } ;

// вычисление size — количества элементов в массиве

int size = sizeof ( array ) / sizeof ( array [ 0 ] ) ;

// предположение, что минимальный элемент имеет индекс 0

int jMin = 0 ;

// цикл проверки элементов массива

for ( int j = 1; j < size; j++ )

if ( array [ j ] < array [ jMin ] )

jMin = j ;

// вывод массива

cout << "Elements of array\n" ;

for ( int j = 0; j < size; j++ )

cout << array [ j ] <<" "<< '\t' ;

// вывод минимального значения array [ jMin ]

cout << "\nMinimum = " << array [ jMin ] << endl ;

return 0 ;

}

2 случай: каждому элементу массива присвоить случайно выработанное число

#include <iostream>

using namespace std ;

const int N = 100 ; int fk; // fk – переменная по фактическое количество элементов

int main ( )

{

// объявление массива из 100 элементов целого типа

int array [ N ] ;

do{

cout << "\n Введите фактическое количество элементов \t";

cin >> fk;

}while (fk > N) ;

// цикл ввода элементов массива

for ( int j = 0; j < fk; j++ )

{

cout << "Enter array [" << j << "] -> " ;

array [j] = rand();

cout << array [ j ] <<" "<< '\n' ;

}

// вывод подсказки

cout << "\n\nThe entered array\n" ;

// цикл вывода элементов массива

for ( int j = 0; j < fk; j++ )

cout << array [ j ] <<" "<< '\t' ;

cout << endl ;

for ( int j = 0; j < fk; j++ )

{

cout << "Enter array [" << j << "] -> " ;

array [j] = rand()/N;

cout << array [ j ] <<" "<< '\n' ;

}

return 0 ;

}

3 случай:

Пример ввода/вывода одномерного массива простого типа

#include <iostream>

using namespace std ;

const int N = 100 ; int fk; // fk – переменная по фактическое количество элементов

int main ( )

{

// объявление массива из 100 элементов целого типа

int array [ N ] ;

do{

cout << "\n Введите фактическое количество элементов \t";

cin >> fk;

}while (fk < N) ;

// цикл ввода элементов массива

for ( int j = 0; j < fk; j++ )

{

cout << "Enter array [" << j << "] -> " ;

cin >> array [ j ] ;

}

// вывод подсказки

cout << "\n\nThe entered array\n" ;

// цикл вывода элементов массива

for ( int j = 0; j < fk; j++ )

cout << array [ j ] <<" "<< '\t' ;

cout << endl ;

return 0 ;

}

Пузырьковая сортировка.

#include <cstdlib>

#include <ctime>

#include <iostream>

using namespace std;

void main ()

{

const int k = 100;

int fk; int i;

do

{

cout <<"fk = ";cin>>fk;

}

while (fk > k);

int mas[k];

// цикл ввода элементов массива

srand(( unsigned)time(NULL));

cout<<"\n isxod mas\n";

for ( i = 0; i < fk ; i++)

{

mas[i] = rand()%15+2;

cout<< mas[i]<<'\t';

}

bool pr = 0; int dmas; //предполагаем, что ряд не отсортирован

while (pr == false) //до тех пор пока ряд не отсортирован - сортируем

{

pr = true; //предположим, что не будет ни одной перестановки

for(i = 0; i < fk-1 ; i++)

{

if (mas[i] < mas[i+1])//если следующий элемент больше предыдущий

{

dmas = mas[i]; //делаем перестановку

//наибольший элемент

//переставляем вперед

mas[i] = mas[i+1];

mas[i+1] = dmas;

pr = false; //принимаем признак ложного ряда

}

}

}

cout<<"\n res mas \n";

for ( i = 0; i < fk ; i++)

{

cout<<mas[i]<<'\t';

}

// TODO: Add your control notification handler code here

}

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