Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Массивы и строки как параметры функций



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

Пример:

//вычисление суммы элементов массива

//вариант 1

int sum (int n, int a[] )

{

int i, int s=0;

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

s+=a[i]

return s;

}

void main()

{

int a[]={ 3, 5, 7, 9, 11, 13, 15 };

int s = sum( 7, a );

cout< < s;

}

//вариант 2

int sum (int n, int *a)

{

for(int i=0, s=0; i< n; s+=*(a+i), i++ );

return s;

}

void main()

{

int a[]={ 3, 5, 7, 9, 11, 13, 15 };

int s = sum( 7, a );

cout< < s;

}

Строки в качестве фактических параметров могут быть определены либо как одномерные массивы типа char[], либо как указатели типа char*. В отличие от обычных массивов в этом случае нет необходимости явно указывать длину строки.

 

Постановка задачи

Используя функции, решить указанную в варианте задачу. Массив должен передаваться в функцию как параметр.

Варианты

  1. В двумерном массиве записаны слова, представляющие собой последовательность цифр, завершающихся 0. Необходимо распечатать слова через запятую, заключив печатную строку в скобки. Длина печатной строки 60 символов. Извлечение слова оформить в виде функции.

Например:

исходные данные - 123023402303450

результат - (123, 234, 23, 345)(23445, 234567, 1)(23445567767, 45)

  1. Написать функцию для обмена строк двумерного массива с ее помощью отсортировать массив по элементам третьего столбца.
  2. Написать процедуру для суммирования матриц. С ее помощью сложить исходную матрицу и транспонированную (т. е. полученную поворотом исходной на 90 °).
  3. Написать функцию для удаления строки из двумерного массива. Оставшиеся строки должны быть расположены плотно, недостающие элементы заменяются 0. С помощью разработанных функций исключить из массива строки с номерами от А до В.
  4. Определить является ли матрица ортонормированной, т. е. такой, что скалярное произведение каждой пары различных строк равно 0, а скалярное произведение строки самой на себя равно 1.
  5. Элемент матрицы является седловой точкой, если он является наименьшим в своей строке и наибольшим в своем столбце (или наоборот: наибольшим в своей строке и наименьшим в своем столбце).Для заданной матрицы определить все седловые точки.
  6. Написать процедуру обмена столбца и строки двухмерного массива. С ее помощью поменять местами те строки и столбцы, первые элементы которых совпадают.
  7. Написать функцию транспонирования квадратной матрицы (т.е. поворота исходной матрицы на 90 °). С ее помощью определить является ли заданная матрица симметрической. (Матрица называется симметрической, если транспонированная матрица равна исходной).
  8. Написать функцию для вычисления суммы элементов квадратной матрицы, которые расположены ниже главной диагонали. С ее помощью найти максимальное значение такой суммы в n матрицах.
  9. Написать функцию, проверяющую есть ли отрицательные элементы в указанной строке двумерного массива. Удалить из массива все строки с отрицательными элементами, удаленная строка заполняется 0 и переносится в конец массива.
  10. Написать функцию, проверяющую по возрастанию или убыванию упорядочена указанная строка двумерного массива. Упорядочить по возрастанию все строки двумерного массива, которые неупорядочены по убыванию.
  11. Написать функцию, для поиска максимального элемента в указанной строке двумерного массива. Сдвинуть в двумерном массиве все строки циклически вправо на количество элементов равное максимальному элементу в этой строке.
  12. Определить можно ли в двумерном массиве найти такой столбец, который разбивает массив на два так, что сумма элементов в первом больше, чем сумма элементов во втором. Сам столбец в разбиваемые части не входит.
  13. Вычислить произведение всех столбцов массива, у которых первый элемент больше элементов расположенных на главной и побочной диагонали.
  14. Задан двумерный массив. Найти сумму элементов первого столбца без одного последнего элемента, сумму элементов второго столбца без двух последних, сумму элементов третьего столбца без трех последних и т. д. Последний столбец не обрабатывается. Среди найденных сумм найти максимальную.
  15. Задан двумерный массив N x N. Разрешается произвольно переставлять элементы внутри любого столбца. Проверить, можно ли выполнив конечное количество перестановок в столбцах, расположить на побочной диагональ элементы так, чтобы он возрастали.
  16. Задан двумерный массив N x M. Найти в нем подмассив 3 х 3, сумма элементов которого максимальна. N и M могут быть не кратны трем.
  17. Задан двумерный массив N x N. Последовательно рассматриваются квадратные подмассивы, правый верхний элемент которых лежит на побочной диагонали. В каждом таком подмассиве находится максимальный элемент. Путем перестановок строк и столбцов (целиком) элемент надо переместить в правый верхний угол подмассива. Проверить получилась ли на побочной диагонали убывающая последовательность элементов.
  18. Задана строка из N2 цифр. Установить можно ли, разбив строку на подстроки длиной N, записать их в строки двумерного массива N x N по одной цифре в одном элементе так, чтобы они в первом столбце расположились в порядке возрастания.
  19. Найти минимальный из неповторяющихся элементов двумерного массива.
  20. Найти максимальный из повторяющихся элементов двумерного массива.
  21. В двумерном массиве найти среднее арифметическое первого столбца и количество элементов в каждом из следующих столбцов, превышающих среднее арифметическое предыдущего столбца.
  22. Задан одномерный массив состоящий из N целых чисел. Сформировать на его основе двумерный массив N x N так, чтобы сумма элементов в первом столбце была равна первому элементу одномерного массива, сумма элементов во втором столбце была равна второму элементу одномерного массива и т. д. Нули не использовать.
  23. Определить сколько элементов двумерного массива больше любого элемента на главной диагонали.
  24. Из двумерного массива в одномерный записали сначала строки в произвольном порядке, затем столбцы в произвольном порядке. Написать программу восстанавливающую исходный двумерный массив по одномерному, если известна размерность двумерного массива и элементы в нем не повторяются.

Содержание отчета

  1. Постановка задачи.
  2. Вариант задания
  3. Текст программы.
  4. Результат решения конкретного варианта.

 

Лабораторная работа № 6 " Классы и методы"

Цель: Получение навыков работы с классами.

 

Краткие теоретические сведения

Инкапсуляция

В программировании, основанном на абстрактных типах данных, информация сознательно прячется в небольшой части программы. Каждый объект имеет два лица. С внешней точки зрения АТД представляет собой совокупность операций, которые определяют поведение абстракций. Программист, который определяет этот АТД, видит значения переменных, которые используются для поддержания внутреннего состояния объекта.
Например, для абстрактного типа данных stack пользователь видит только описание допустимых операций – pop, push, top. С другой стороны программисту, реализующему stack, необходимо манипулировать конкретными структурами данных. Конкретные детали инкапсулированы в более абстрактный объект.
Каждый экземпляр имеет свою собственную совокупность переменных. Эти значения не должны изменяться клиентами напрямую, а только с помощью методов, ассоциированных с классом.
Объект является комбинацией состояния и поведения. Состояние описывается переменными экземпляра, поведение характеризуется методами. Снаружи клиенты могут узнать только о поведении объектов. Изнутри доступна полная информация о том, как методы обеспечивают необходимое поведение, изменяют состояние и взаимодействуют с остальными объектами.

Разновидности классов

Классы в ООП имеют несколько различных форм и используются для различных целей. Следующие категории охватывают большую часть классов.

  • Управление данными
  • Источник данных и посредники в передаче данных
  • Классы для просмотра данных
  • Вспомогательные или упрощающие проектирование классы.

Это не исчерпывающий список. Если оказывается, что класс разрывается между двумя категориями, то его можно разбить на два класса.
Классы администраторы данных Data Manager (часто называют Data или State) – это классы, основной обязанностью которых является поддержка данных или информации о состоянии чего-либо. Например, для игры в карты основная задача класса Card состоит в том, чтобы хранит масть и ранг карты. Классы администраторы – это фундаментальные блоки проекта, существительные.
Источник данных Data Source – это классы, которые генерируют данные. Посредники при передаче данных (Data Sinks), служат для приема и дальнейшей передачи данных (например, запись в файл). Источники и посредники не хранят внутри себя данные, в отличии от классов-администраторов, они генерируют их по запросу (источники данных) или обрабатывают их при вызове (посредники данных).
Классы просмотра также незаменимы почти в любом приложении. Все программы осуществляют вывод информации (обычно н экран). Т.е. можно изолировать внутренние данные и методы, осуществляющие их вывод. Полезно отделять собственно объект от его визуализации. Благодаря этому принципу системы, обеспечивающие вывод графической информации могут быть значительно упрощены. В идеальном случае модель не требует и не содержит информации о своем визуальном представлении. Это позволяет одну и ту же модель применить в разных приложениях.
К вспомогательным классам можно отнести те классы, которые не содержат полезной информации, но облегчают выполнение сложных заданий. Например, связный список карт – колода.

Пример: Игра в карты

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

Класс Card
Хранить масть и ранг карты Возвращает цвет карты Хранит состояние картинка вверх или вниз Рисует карту на экране Удаляет карту с экрана

Класс Card является администратором данных, который хранит и возвращает значения масти и ранга, и рисует карту. Рассмотрим уточнение класса Card

Класс Card
Suit возвращает масть и ранг карты color- Возвращает цвет карты faceUp - проверяет состояние картинка вверх или вниз draw рисует карту на экране erase - удаляет карту с экрана

 

Интерфейс и реализация

Идеи Парнаса в терминах объектов:

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

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

Классы и методы в языке C++

Классы С++ предлагают расширение предопределенных системных типов. Класс - это определяемый пользователем тип. Каждый класс представляет уникальное множество объектов и операций над ними (методов). Класс предоставляет средства для создания, манипулирования и уничтожения таких объектов.
Что представляет собой хороший класс? Нечто, имеющее небольшое и хорошо определенное множество действий. Нечто, что можно рассматривать как " черный ящик", которым манипулируют только посредством этого множества действий. Нечто, чье фактическое представление можно любым мыслимым способом изменить, не повлияв на способ использования множества действий. Нечто, чего можно хотеть иметь больше одного.
В общем случае, класс представляется в следующей форме:

сlass имя класса{список членов};

Описание класса начинается с ключевого слова class. Список членов класса определяет собственные элементы класса.
При описании членов классов возможно указание атрибутов управления доступом к элементам классов. Такими атрибутами являются:

  • public: члены класса видны извне класса
  • private: соответствующие элементы могут использоваться только внутри класса

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

Поскольку пользователя часто интересует открытая часть класса, то в описании она должна идти первой.

Функция card(suit, int) в описании класса является уникальной – она имеет тоже имя, что и класс и не имеет возвращаемого значения. Эта функция называется конструктором. Она используется при инициализации создаваемых экземпляров класса. Методы draw и halfdraw описаны в стиле прототипа функции.

Листинг 6.1 Описания класса card на C++
enum suits {diamond, club, heart, spade};
enum colors {red, black};
class card {
public:
card(suits, int);
// доступ к атрибутам
colors color ();
bool faceUp ();
int rank ();
suits suit ();
// выполняемые действия
void draw (window &, int x, int y);
void halfdraw (window &, int x, int y);
void flip ();
private:
bool faceup;
int r; // ранг
suits s; // масть
};
Метод suit возвращает значение масти в s. А rank значение ранга r.

Файл для реализации данного класса должен обеспечить работу методов, описанных в интерфейсном файле.
#include “card.h”
card:: card(suits sv, int rv)
{
s=sv; // масть инициализируется
r=rv; // ранг инициализируется
faceup=true; // начальное положение картинкой вверх
}
int card:: rank() { return r; }

Комбинация имени класса и имени метода образует полное имя.

При программировании с использованием классов очень часто используется много маленьких функций. Это может страшно понизить эффективность, потому что стоимость вызова функции (хотя и вовсе не высокая по сравнению с другими языками) все равно намного выше, чем пара ссылок по памяти, необходимая для тела функции. Чтобы справиться с этой проблемой, был разработан аппарат inline-функций (встраиваемые функции). Компилятор преобразует вызов функции в ее код. Функция, определенная (а не просто описанная) в описании класса, считается inline. Кроме того, функцию можно определить с ключевым словом inline вне протокола класса.

inline int card:: rank() { return r; }

Листинг 6.2. Описание класса card с inline методами
class card {
public:
// конструкторы
card(suits, int);
card();
card(const card & c);
// доступ к атрибутам
colors color ();
bool faceUp () {return faceup; }
int rank () { return r; }
suits suit () { return s; }
// выполняемые действия
void draw (window &, int x, int y);
void halfdraw (window &, int x, int y);
void flip () { faceup =! faceup; }
private:
bool faceup;
int r; // ранг
suits s; // масть
};
Многие компиляторы требуют описание переменных, используемых во встраиваемых функциях, до определения функций. Поэтому либо переносят поля private до public, либо выносят встраиваемые функции в файл реализации с описателем inline.
Язык С++ поддерживает неполное описание классов: class X. Неполное описание класса позволяет использовать ссылки на эти классы до их полного определения. Объекты типа класс могут использоваться как аргументы функций и как возвращаемые функциями значения.

Ключевое слово this

Нестатические функции-члены класса оперируют с тем объектом типа класса, из которого они вызваны. Ключевое слово this обозначает специальную локальную переменную, доступную в теле любой функции-члена класса, описанной без спецификации static. Переменная this не требует описания и всегда содержит указатель соответствующего объекта.

  • this-> имя члена указывает на объект, членом, которого он является.
  • *this представляет собой сам объект и, в зависимости от контекста, может быть лево- или правосторонней величиной
  • this представляет собой адрес объекта.

Пример
class C {
int c1, c2;
public:
void init(int b) { c2=b; c1=b+1; }
C & inc() { c1++; c2++; return *this; }
void *adress() { return this; }
void print() { cout < < c1 < < c2; }
};
void main(void) {
C a;
a.init(10); a.print(); cout < < “ adress=“ < < a.adress< < “ inc “ < < a.inc().print() < < endl;
}
Указатель на объект, для которого вызвана функция-член, является скрытым параметром функции. На этот неявный параметр можно ссылаться явно как на this. В каждой функции класса x указатель this неявно описан как
x* this;
и инициализирован так, что он указывает на объект, для которого была вызвана функция-член. this не может быть описан явно, так как это ключевое слово. Класс x можно эквивалентным образом описать так:

class x { int m; public: int readm() { return this-> m; } }; class x { int m; public: int readm() { return m; } };

В языке Java this обозначает не указатель на объект, а собственно объект.

Функции-члены

Метод в C++, J++ принято называть функцией-членом класса, о пересылке сообщений говорят как о вызове функции-члена класса.


Поделиться:



Популярное:

Последнее изменение этой страницы: 2016-07-14; Просмотров: 1175; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.022 с.)
Главная | Случайная страница | Обратная связь