Примеры выполнения задания
МАССИВЫ, СТРОКИ – ЧЛЕНЫ КЛАССА Основные понятия Массивы являются наиболее часто используемыми структурами данных, представляющими собой совокупность элементов одного и того же типа. Наиболее часто в программах применяются одномерные и двумерные массивы (матрицы), но язык С++ позволяет работать и с многомерными массивами. Одномерный массив представляет собой совокупность однотипных элементов, имеющих одно имя (имя массива), при этом доступ к каждому элементу массива осуществляется по имени массива и индексу элемента. Индекс первого элемента всегда 0, далее следуют 1, 2, и т.д. int b[10]; // объявление массива b из 10 целых чисел int a[5] = {1, 2,3, 4, 5}; // объявление и иинициализация массива int c = a[2]; // c = 3 for(int i = 0; i < 5; i++) // доступ к элементам массива a удобнее cout<<a[i]<<’ ‘; // всего осуществлять, пользуясь циклом for // или *(a+i), т. к. имя массива является указателем на начало массива Любой доступ к элементу массива, осуществляемый индексированием, может быть выполнен с помощью указателя. При этом обычно программа работает быстрее, а во многих случаях имеет место экономия памяти. Адресация элементов массива с помощью указателей выполняется следующим образом: int a[4]; int *pa; // указатель pa на тип int pa = a;// pa присваивается адрес массива a for(int i = 0; i < 4; i++) cout<<*pa++<<’ ‘; // доступ к элементам массива // или cout<<*(pa+i); или cout<<pa[i]; Отметим, что прибавление к указателю единицы обеспечивает переход к следующему элементу массива, а также то, что имя массива является константным указателем, поэтому его нельзя изменять, но можно присваивать указателям соответствующего типа. Чаще всего одномерные массивы используются для создания символьных строк. В С++ строка определяется как массив значений типа char, который завершается нулевым символом (‘\0’). Доступ к элементам строки осуществляется так же, как доступ к элементам любого массива. char[] = “123456”; // инициализация строки gets(str); // ввод строки cout<<"stroka== "<<str<<endl; // вывод строки for(i = 0; str[i]; i++); cout<<str[i]; // доступ к элементам строки Двумерный массив (матрица) – представляет собой массив одномерных массивов. Каждый элемент массива имеет два индекса – номер строки и номер столбца, которые указываются в отдельных квадратных скобках. Например: int b[3][4]; // объявление двумерного массива int a[2][2] = {{1, 2}, // явная инициализация 0-й строки {3, 4}}; // явная инициализация 1-й строки for(int i = 0; i < 3; i++) // запонение и обработку матриц производят, for(int j = 0; j < 4; j++) // пользуясь вложенными циклами cout<<a[i][j]<<’ ‘; // доступ к элементам массива или * (a[i]+j) Статические массивы – это массивы с фиксированной размерностью, элементы таких массивов занимают сплошой участок в памяти компьютера и располагаются последовательно друг за другом, причём элементы двумерного массива размещаются по строкам. Для создания, просмотра и обработки массивов используются циклы (для двумерных массивов – вложенные). Динамические массивы – это массивы, для которых выделяется память и определяется размер во время выполнения программы. Создаётся динамический массив с помощью операции new и указателя. После завершения использования массива выделенную под массив память освобождают с помощью операции delete. Явно инициализировать динамические массивы нельзя. Создание одномерного динамического массива: int n; cin>>n; // ввод размерности массива n int *p; // объявление указателя p на целый тип p= new int[n]; // выделение памяти для массива delete [] p; // удаление выделенной памяти for(int i = 0; i < 4; i++) cout<<p[i]<<’ ‘; // доступ к элементам массива с индексом i // или *(p+i) Если с помощью операции new невозможно выделить требуемый объём памяти, то операция new возвратит нулевой указатель. Создание динамической строки: char *pstr; cin>> len; pstr = new char[len]; delete [] pstr; // удаление строки Создание двумерного динамического массива из n строк и m столбцов: int n, m; int ** p; // указатель p на массив указателей cin>>n; cin>>m; p = new *int[n]; // память под массив указателей на строки for(int i; i < n; i++) p [i] = new int[m]; // выделение памяти для каждой строки for(int i = 0; i < 3; i++) // доступ к элементам массива for(int j = 0; j < 4; j++) cout<< p [i][j]<<’ ‘ // или *(p [i] + j) или *(*(p + i) + j) Удаление двумерного динамического массива происходит в несколько этапов: for(int i = 0; i < n; i++) // удаление одномерных массивов (строк) delete [] p[i]; delete [] p; // удаление массива указателей на строки Следует помнить, что выделенная память для двумерного динамического массива не представляет собой сплошной участок, поскольку она выделяется несколькими операциями new. Примеры выполнения задания // Пример 1. Определение класса для работы с одномерным массивом // (динамическим). Нахождение суммы элементов массива. #include <iostream> using namespace std; class Massiv { // определение класса Massiv int n; int *p; // указатель на тип int int sum; public: Massiv(int k); // конструктор ~Massiv(){delete [] p;} // деструктор определён в классе void summa(); void show(); }; Massiv::Massiv(int k){ // определение конструктора n = k; // инициализация n p = new int[n]; // выделение динамической памяти под массив if(!p){ cout<<"no memory"<<endl; exit(1); } srand(k); for(int i = 0; i < n; i++) // инициализация массива p[i] = rand()%15 - 5; } void Massiv::summa(){ // определение функции summa () sum = 0; for(int i = 0; i < n; i++) sum = sum + p[i]; } void Massiv::show(){ // определение функции show () cout<<"Massiv=="<<endl; for(int i = 0; i < n; i++){ cout.width(4); cout<<p[i]<<" "; } cout<<"\n Summa elementov massiva = "<<sum<<endl; }
int main (){ int kol; cout<<"Vvedi chislo elementov:"; cin>>kol; Massiv ob(kol); // создание объекта ob типа Massiv ob.summa(); ob.show(); system("pause"); return 0; } // Пример 2.. Определение класса для работы с динамическим // двумерным массивом. Использование деструктора. #include <iostream> using namespace std; class Matr { int **a; // указатель на массив указателей int n, m; // размерности матрицы public: Matr(int k, int l); // конструктор ~Matr(); // деструктор void show(); // функция вывода матрицы }; Matr::Matr(int k, int l){ // определение конструктора n = k; m = l; srand(k); a = new int*[n]; if(a == NULL){ cout<<"No memory"<<endl; exit(1); } for(int i = 0;i < n; i++){ a[i] = new int[m]; if(a[i] == NULL){ cout<<"No memory"<<endl; exit(1); } for(int j = 0; j < m; j++) *(a[i] + j) = rand() % 15 - 5; } } Matr::~Matr(){ // определение деструктора for(int i = 0; i < n; i++) delete [] a[i]; // удаление строк delete [] a; // удаление массива указателей } void Matr::show(){ // определение show () cout<<"Matrix== "<<endl; for (int i = 0; i < n; i++){ for (int j = 0; j < m; j++){ cout.width(4); cout<<a[i][j]<<" "; } cout<<endl; } } int main (){ int n, m; cout<<"Vvedi n, m: "; cin>>n>>m;
|