Студопедия — Примеры выполнения задания
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Примеры выполнения задания

МАССИВЫ, СТРОКИ – ЧЛЕНЫ КЛАССА

Основные понятия

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

Одномерный массив представляет собой совокупность однотипных элементов, имеющих одно имя (имя массива), при этом доступ к каждому элементу массива осуществляется по имени массива и индексу элемента. Индекс первого элемента всегда 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;




<== предыдущая лекция | следующая лекция ==>
Обработка строк, символов | УСЛОВИЯ НЕПРЕРЫВНОСТИ МОНОТОННОЙ ФУНКЦИИ. ob.show(); // вызов функции show()

Дата добавления: 2015-08-31; просмотров: 355. Нарушение авторских прав; Мы поможем в написании вашей работы!



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

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

Функция спроса населения на данный товар Функция спроса населения на данный товар: Qd=7-Р. Функция предложения: Qs= -5+2Р,где...

Аальтернативная стоимость. Кривая производственных возможностей В экономике Буридании есть 100 ед. труда с производительностью 4 м ткани или 2 кг мяса...

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

Тема 2: Анатомо-топографическое строение полостей зубов верхней и нижней челюстей. Полость зуба — это сложная система разветвлений, имеющая разнообразную конфигурацию...

Виды и жанры театрализованных представлений   Проживание бронируется и оплачивается слушателями самостоятельно...

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

Типовые примеры и методы их решения. Пример 2.5.1. На вклад начисляются сложные проценты: а) ежегодно; б) ежеквартально; в) ежемесячно Пример 2.5.1. На вклад начисляются сложные проценты: а) ежегодно; б) ежеквартально; в) ежемесячно. Какова должна быть годовая номинальная процентная ставка...

Выработка навыка зеркального письма (динамический стереотип) Цель работы: Проследить особенности образования любого навыка (динамического стереотипа) на примере выработки навыка зеркального письма...

Studopedia.info - Студопедия - 2014-2024 год . (0.01 сек.) русская версия | украинская версия