Главная

Популярная публикация

Научная публикация

Случайная публикация

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

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






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




Динамические массивы создают с помощью операции new, при этом необходимо указать тип и размерность, например:

int n = 100:

float *р = new float [ n ];

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

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

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

Доступ к элементам динамического массива осуществляется точно так же, как к статическим, например, к элементу номер 5 приведенного выше массива можно обратиться как р[5] или *(р+5).

Альтернативный способ создания динамического массива — использование функции mallос библиотеки С:

int n =100;

float *q =(float *) malloc(n *sizeof(float)):

Операция преобразования типа, записанная перед обращением к функции mallос, требуется потому, что функция возвращает значение указателя типа void*, а инициализируется указатель на float.

Память, зарезервированная под динамический массив с помощью new [], должна освобождаться оператором delete [], а память, выделенная функцией mallос — посредством функции free, например:

delete [ ] р; free (q);

При несоответствии способов выделения и освобождения памяти результат не определен. Размерность массива в операции delete не указывается, но квадратные скобки обязательны.

Для создания динамического многомерного массива необходимо указать в операции new все его размерности (самая левая размерность может быть переменной), например:

int nstr = 5:

int ** m = (int **) new int [nstr][10]:

Более универсальный и безопасный способ выделения памяти под двумерный массив, когда обе его размерности задаются на этапе выполнения программы, приведен ниже:

int nstr, nstb:

cout <<" Введите количество строк и столбцов:";

cin >>nstr>>nstb:

int **a=new int * [nstr]; / / 1

for (int i=0;i<nstr; i++) / / 2

a[i]=new int [nstb]; / / 3

В операторе 1 объявляется переменная типа «указатель на указатель на int» и выделяется память под массив указателей на строки массива (количество строк – nstr). В операторе 2 организуется цикл для выделения памяти под каждую строку массива. В операторе 3 каждому элементу массива указателей на строки присваивается адрес начала участка памяти, выделенного под строку двумерного массива.

Освобождение памяти из-под массива с любым количеством измерений выполняется с помощью операции delete[ ]. Указатель на константу удалить нельзя.

 

Функции в Си

Функция — это именованная последовательность описаний и операторов, выполняющая какое-либо законченное действие. Функция может принимать параметры и возвращать значение.

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

С использованием функций в языке СИ связаны три понятия:

- определение функции – описание действий, выполняемых функцией;

- объявление функции – задание формы обращения к функции;

- вызов функции.

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

Определение функциив соответствии с синтаксисом языка СИ имеет следующую форму:

[спецификатор_класса_памяти] [спецификатор_типа]

имя_функции ([список_формальных_параметров])

{

тело_функции

}

 

Пример 1:

int lat (unsigned char r) { if (r >= ’А’ && r <= ’ z’) return 1; else return 2; }

 

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

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

int lat (unsigned char r);

или

int lat (unsigned char);

Если прототип функции не задан, а встретился вызов функции, то строится неявный прототип из анализа формы вызова функции. Тип возвращаемого значения создаваемого прототипа int, а список типов и число параметров функции формируется на основании типов и числа фактических параметров используемых при данном вызове.

Таким образом, прототип функции необходимо задавать в следующих случаях:

• функция возвращает значение типа, отличного от int;

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

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

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

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

• extern – глобальная видимость во всех модулях программы (по умолчанию);

• static – видимость только в пределах модуля, в котором определена функция.

 

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

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

 

Варианты

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

2. Написать процедуру для суммирования матриц. С ее помощью сложить исходную матрицу и транспонированную.

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

4. Определить является ли матрица ортонормированной, т. е. такой, что скалярное произведение каждой пары различных строк равно 0, а скалярное произведение строки самой на себя равно 1.

5. Элемент матрицы является седловой точкой, если он является наименьшим в своей строке и наибольшим в своем столбце (или наоборот: наибольшим в своей строке и наименьшим в своем столбце).Для заданной матрицы определить все седловые точки.

6. Написать процедуру обмена столбца и строки двухмерного массива. С ее помощью поменять местами те строки и столбцы, первые элементы которых совпадают.

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

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) Ввод и вывод данных в С и С++.

5) Написать программу вычисления суммы случайного числа случайных элементов из диапазона от -150 до 125.

 


Рекомендуемая литература

1. Т.А. Павловская. С/С++. Программирование на языке высокого уровня. СПб.: «Питер», 2003г.

2. Липман С. Лажойе Ж. Язык программирования С++. Полное руководство - М: «ДМК Пресс», 2006 г.

3. Страунструп Б. Дизайн и эволюция С++ - М: «ДМК Пресс», 2007г.

4. Дейл Н., Уимз Ч., Хедингтон М. Программирование на С++. - М: «ДМК Пресс», 2007г.

5. Мейерс С. Наиболее эффективное использование C++. 35 новых рекомендаций по улучшению ваших программ и проектов. - М: «ДМК Пресс», 2007г.

6. Горнаков С.Г. Symbian OS. Программирование мобильных телефонов на С++ и Java 2 ME, 2008г.

 

 

Содержание

 

Введение. 3

Лабораторная работа №1. "Знакомство с языком С. Выполнение программ с линейной вычислительной структурой". 4

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

1.1. Структура С-программ.. 4

1.1.1. Директива препроцессора. 4

1.1.2. Заголовок и завершение программы.. 5

1.2. Константы и переменные. 5

1.3. Операции языка Си. 6

1.4. Ввод и вывод данных. 8

1.4.1. Форматный ввод и вывод данных. 8

1.4.2. Потоковый ввод и вывод данных. 8

1.5. Основные математические функции. 8

1.6. Вспомогательные символы.. 9

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

3. Вопросы на защиту. 11

Лабораторная работа №2. "Операторы языка Си". 12

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

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

3. Вопросы на защиту. 17

Лабораторная работа №3. "Вычисление суммы ряда". 18

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

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

3. Вопросы на защиту. 22

Лабораторная работа № 4. "Обработка одномерных массивов". 23

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

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

2) вычисление параметра полученного массива; 23

3. Вопросы на защиту. 27

Лабораторная работа №5. "Использование функций для обработки двумерных массивов" 28

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

1.1. Многомерные массивы.. 28

1.2. Динамические массивы.. 28

1.3. Функции в Си. 29

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

3. Вопросы на защиту. 31

Рекомендуемая литература. 32






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных