Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные рабоы 2013г.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
163 Кб
Скачать
☆

Лабораторная работа №2 Работа с массивами. Одномерные статические массивы. Многомерные динамические массивы

Цель работы

Изучение способов определения и обработки одномерных и многомерных массивов. Освоение двух форм выделения памяти под массив: статического и динамического, правил использования указателей для доступа к элементам массива.

Задание 1

№ варианта

Задание

1.

Определить в программе одномерный массив Х размера n. Сформировать из него 4 массива. Первый должен содержать записанные подряд положительные элементы массива Х. Второй - отрицательные элементы массива Х. Третий - подряд запиcанные индексы элементов первого массива, которые они имели в массиве Х. Четвертый cодержит подряд записанные индексы элементов второго массива, которые они имели в массиве Х.

2.

В одномерном массиве D размера n, значения элементов которого вводятся с клавиатуры, определить количество элементов, которые входят в массив более, чем по одному разу.

3.

Найти минимальный среди положительных элементов определенного в программе одномерного массива Х размера n. Вывести на печать индексы отрицательных элементов массива, а также индекс минимального элемента.

4.

Дан одномерный массив Y размера n. Все положительные элементы массива возвести в квадрат, а отрицательные в куб. Отпечатать старый и новый массив, а также сумму элементов в старом и новом массиве отдельно.

5.

Переставьте элементы одномерного массива в обратном порядке. Нового массива не заводить.

6.

Дан одномерный массив Z размера n. Найти количество нулевых элементов в массиве, сами нулевые элементы заменить на единицу, их порядковые номера записать подряд в массив В.

7.

Из исходного одномерного массива А размера n образовать два массива. В первый массив войдут подряд все четные элементы массива А, во второй массив войдут подряд записанные порядковые номера четных элементов, которые они имели в массиве А.

8.

Найти произведение положительных элементов одномерного массива А размера n и произведение отрицательных элементов одномерного массива В размера m. Вывести на печать наибольшее из произведений.

9.

Дан одномерный массив Mas размера n. Все его элементы, не равные 0, перепишите, сохраняя их порядок, в начало массива, а нулевые – в конец массива. Нового массива не заводить.

10.

В одномерном массиве D размера n, значения элементов которого вводятся с клавиатуры, найти количество соседств двух элементов разного знака.

Задание 2

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

№ варианта

Задание

1.

Дана действительная матрица заданного размера. Найти сумму всех элементов, расположенных выше главной диагонали матрицы.

2.

Дана целочисленная матрица заданного размера. Определить максимальный элемент и его индексы, а также минимальный элемент и его индексы. Сам максимальный элемент заменить внутри матрицы на 100, а минимальный элемент на -100.

3.

Определить, есть ли в матрице заданного размера "седловые" точки.

4.

Дана целочисленная матрица заданного размера. Определить, является ли она "магическим" квадратом.

5.

Переверните исходную матрицу n×n относительно ее главной диагонали. Исходную и полученную матрицы выведите на экран.

6.

Рассчитать «след» квадратной матрицы заданного размера.

7.

Напишите программу для перестановки максимальных элементов строк числовой таблицы на главную диагональ. Элементы главной диагонали поставьте на место максимального элемента в этой строке.

8.

Дана целочисленная матрица заданного размера. Определить, является ли она "латинским" квадратом.

9.

Найти сумму наименьших значений элементов в столбцах действительной матрицы заданного размера.

10.

В действительной матрице заданного размера произвести попарную перестановку строк, т.е. поменять местами 1 и 2 строки, 3 и 4 строки и т.д. Напечатать для сравнения обе матрицы.

Задание 3

Затем решить задачу из задания 2, используя динамическое выделение памяти и обработку массива с применением указателей.

Методические указания к выполнению заданий

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

Массив – совокупность элементов одного типа. Многомерные массивы рассматриваются как одномерные, элементами которых являются также массивы. Нумерация элементов массива начинается с нуля.

Объявляются массивы следующим образом:

int mas[100]; // одномерный массив mas из 100 элементов

float data[10] [50]; // двумерный массив data из 500 элементов

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

mas[10] = 59; // десятому элементу массива mas присваивается значение 59

mas[1] = mas[0] + 1; // первый элемент массива mas на 1 больше нулевого

data[0][5] = 3.14; //пятому элементу массива data присваивается значение 3.14

Инициализация массивов возможна при их определении:

double d[] = {1, 2, 3, 4, 5};

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

Массив должен быть сначала введен в память компьютера. И ввод-вывод элементов массива, и его обработка выполняются в цикле. Для организации циклов в программе можно использовать различные операторы, в частности оператор for.

Использование датчика случайных чисел для формирования массива

Датчик случайных чисел (ДСЧ) – это программа, которая формирует псевдослучайное число. Простейший ДСЧ работает следующим образом:

Берется большое число К и произвольное . Формируются числа х1=дробная_часть(х0*К); х2=дробная_часть(х1*К); и т. д. В результате получается последовательность чисел х0, х1, х2,. . . беспорядочно разбросанных по отрезку от 0 до 1. Их можно считать случайными, а точнее псевдослучайными. Реальные ДСЧ реализуют более сложную функцию f(x). В С++ есть функция int rand() – возвращает псевдослучайное число из диапазона 0..RAND_MAX=32767, описание функции находится в файле <stdlib.h>.

Пример формирования и печати массива с помощью ДСЧ:

#include <iostream>

using namespace std;

void main()

{

const int n=10;

int a[n];

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

a[i]=rand()%10-5;

cout<<a[i]<<"\t";

}

}

При уменьшении или увеличении длины массива необходимо изменять его реальную длину.

Для организации динамических массивов в стиле С используются указатели и функции выделения памяти malloc(), calloc(), free() и др., а в стиле С++ для создания динамических переменных используют операцию new, определенную следующим образом:

указатель = new имя_типа[инициализатор];

где инициализатор – выражение в круглых скобках.

Операция new позволяет выделить и сделать доступным участок динамической памяти, который соответствует заданному типу данных. Если задан инициализатор, то в этот участок будет занесено значение, указанное в инициализаторе.

int*x=new int(5);

Для удаления динамических переменных используется операция delete, определенная в С++:

delete указатель;

где указатель содержит адрес участка памяти, ранее выделенный с помощью операции new.

delete x;.

Примеры:

1)int b=new int[100];//выделили в динамической памяти место под массив из 100 элементов.

2)int **matr=new int* [n];//объявляем массив указателей на строки

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

matr[i]=new int [m];//выделяем память под элементы матрицы

Указатель – это переменная, значением которой является адрес другой переменной. Объявляется указатель следующим образом:

тип *идентификатор;

инициализируется с помощью операции получения адреса &.

int x, *ptr = & x; //переменная ptr является указателем на целое и инициализируется адресом переменной x

Необходимо знать, что имя массива – это константа-указатель на начало массива (на нулевой элемент). Всякий раз, когда в выражении появляется идентификатор типа массива, он преобразуется в указатель на нулевой член массива. По определению операция индексирования [] интерпретируется таким образом, что E1[E2] идентично *((E1)+(E2)). В силу правил преобразования, применяемых к +, если E1 массив и E2 целое, то E1[E2] относится к E2-ому члену E1.

Это правило аналогичным образом применяется в случае многомерного массива. Если E является n-мерным массивом ранга i*j*...*k, то возникающее в выражении E преобразуется в указатель на (n-1)-мерный массив ранга j*...*k. Рассмотрим, например,

int x[3][5];

Здесь x - массив целых размером 3*5. Когда x возникает в выражении, он преобразуется в указатель на (первый из трех) массив из 5 целых чисел. В выражении x[i], которое эквивалентно *(x+1), x сначала преобразуется, как описано, в указатель, затем 1 преобразуется к типу x, что включает в себя умножение 1 на длину объекта, на который указывает указатель, а именно объект из 5 целых. Результаты складываются, и используется косвенная адресация для получения массива (из 5 целых), который в свою очередь преобразуется в указатель на первое из целых. Если есть еще один индекс, снова используется тот же параметр; на этот раз результат является целым.

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

Определение динамического массива из 25 целых чисел:

int *p;

int n=25;

p=(int *)malloc(n);

Обращение к нулевому элементу массива:

* p;

Обращение к i - элементу массива:

* (p + i);

Обращение к ( i , j ) - элементу двумерного массива:

p[i][j] = = *(p[i]+j) = = *(*(p+i)+j).

Пример:

int *u=(int*)malloc(sizeof(int)); // в функцию передается количество требуемой памяти в байтах, т. к. функция malloc возвращает значение типа void*, то его необходимо преобразовать к типу указателя (int*).

free(u); //освобождение выделенной памяти.

Некотрые определения

Cедловые точки матрицы – минимальный элемент в строке и максимальный в столбце.

Пример:

Cлед матрицы – сумма элементов на главной диагонале.

Магический квадрат –матрица n*n, где сумма элементов в строке равна сумме элементов в столбце и равна сумме элементов по диагонали.

Латинский квадрат порядка n – матрица nn, составленная из чисел от 1 до n.

Пример:

Числа армстронга: Числа, равные сумме кубов своих цифр: 153=13+53+33; 370=33+73.

Совершенное число равно сумме своих делителей исключая само число.

Дружественное число – если одно равно сумме делителей другого.