Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СиАОД_Тычинина.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
2 Мб
Скачать
☆

Контрольные вопросы

  1. Что такое массив?

  2. Как нумеруются элементы массива?

  3. Если элементов в массиве больше, чем инициализаторов, какие значения примут неинициализированные элементы?

  4. Что такое указатель?

  5. Назовите способы инициализации указателей.

  6. Какие операции можно производить с указателями?

  7. Как осуществляется обращение к элементу массива через указатель?

  8. Как создают динамические массивы в языке С++?

Лабораторная работа №4 Двумерные массивы

Цель работы

Приобретение навыков работы с двумерными массивами.

Теоретическая часть [1, 3]

Многомерные массивы задаются указанием каждого измерения в квадратных скобках.

Например, оператор

int matr [6][8];

задает описание двумерного массива из 6 строк и 8 столбцов. В памяти такой массив располагается в последовательных ячейках построчно. Многомерные массивы размещаются так, что при переходе к следующему элементу быстрее всего изменяется последний индекс. Для доступа к элементу многомерного массива указываются все его индексы, например, matr[i][j], или более экзотическим способом: *(matr[i]+j) или *(*(matr+i)+j). Это возможно, поскольку matr[i] является адресом начала i-й строки массива.

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

int mass2 [][] = { {1. 1}, {0. 2}, {1. 0} };

int mass2 [3][2] = {1, 1, 0, 2, 1, 0}:

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

#include <iostream>

#include <iostream>

using namespace std;

int main(){

setlocale(LC_CTYPE,"RUS");

const int nstr = 4, nstb = 5; // размерности массива

int b[nstr][nstb]; // описание массива

int i, j;

for (i=0; i<nstr; i++) // ввод массива

for (j=0; j<nstb; j++)

cin>>b[i][j];

int istr = -1, MaxKol = 0;

for (i=0; i<nstr; i++){ // просмотр массива по строкам

int Kol=0;

for (j=0; j<nstb; j++)

if ( b[i][j]==0)

Kol++;

if (Kol>MaxKol) {

istr=i; MaxKol=Kol;

}

}

cout<< "исходный массив: \n";

for (i=0; i<nstr; i++){

for (j=0; j<nstb; j++)

cout<<b[i][j]<<' ';

cout<<endl;

}

if (istr==-1)

cout<<"такой строки нет";

else cout<<"номер строки: "<<istr<<endl;

system("pause");

return 0;

}

Номер искомой строки хранится в переменной istr, количество нулевых элементов в текущей (i-й) строке – в переменной Kol, максимальное количество нулевых элементов – в переменной MaxKol. Массив просматривается по строкам, в каждой из них подсчитывается количество нулевых элементов (обратите внимание, что переменная Kol обнуляется перед просмотром каждой строки). Наибольшее количество и номер соответствующей строки запоминаются. Для создания динамического многомерного массива необходимо указать в операции 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 каждому элементу массива указателей на строки присваивается адрес начала участка памяти, выделенного под строку двумерного массива. Каждая строка состоит из nstb элементов типа int (рис. 4.1).

Рисунок 4.1

Задача 4.2. Написать программу, которая для целочисленной матрицы определяет среднее арифметическое ее элементов и количество положительных элементов в каждой строке.

#include <iostream>

using namespace std;

#include <iomanip>

void main(){

setlocale(LC_CTYPE,"RUS");

const int nrow=3, ncol=3;

int a[nrow][ncol];

int i, j;

cout<<"Введите элементы массива "<<endl;

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

for (j=0; j<ncol; j++)

cin>>a[i][j];

for (i=0; i<nrow; i++) {

for (j=0; j<ncol; j++)

cout<<setw(4)<<a[i][j];

cout<<endl;}

int n_pos_el;

float s=0;

for (i=0; i<nrow; i++) {

n_pos_el=0;

for (j=0; j<ncol; j++) {

s+=a[i][j];

if (a[i][j]>0) n_pos_el++;

}

cout<<" Строка: "<<i<<"кол-во положительных

элементов: " <<n_pos_el<<endl;

}

s/=nrow*ncol;

cout<<"Среднее арифметическое: "<<s<<endl;

system("pause");

}

Для того, чтобы элементы матрицы располагались один под другим, используется манипулятор setw(), устанавливающий для очередного вводимого значения ширину поля в 4 символа. Для использования манипулятора подключаем заголовочный файл <iomanip>. После каждой строки выводится символ перевода строки.

Задача 4.3. Написать программу, которая для прямоугольной целочисленной матрицы определяет номер самого левого столбца, содержащего только положительные элементы. Если такого столбца нет, вывести сообщение.

Для решения данной задачи матрицу необходимо просматривать по столбцам. При этом быстрее меняется первый индекс (номер строки). Заведем переменную флаг all_posit, которая перед началом просмотра каждого столбца устанавливается в значение true, а при нахождении отрицательного элемента «опрокидывается» в false. Если все элементы столбца положительны, флаг останется истинным, что будет являться признаком присутствия в матрице искомого столбца.

Если столбец найден, просматривать матрицу дальше не имеет смысла, поэтому выполняется выход из цикла и вывод результата. В программе необходимо предусмотреть случай, когда ни один столбец не удовлетворяет условию. Для этого переменной num, в которой будет храниться номер искомого столбца, присваивается начальное значение -1.

#include <iostream>

using namespace std;

#include <iomanip>

int main() {

setlocale(LC_CTYPE,"RUS");

int nrow, ncol;

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

cin>>nrow>>ncol;

int i, j;

int **a=new int *[nrow]; //выделение памяти под массив

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

a[i]=new int [ncol];

cout<<"vvedite massiv: "<<endl;

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

for (j=0; j<ncol; j++)

cin>>a[i][j]; //ввод массива

for (i=0; i<nrow; i++) {

for (j=0; j<ncol; j++)

cout<<setw(4)<<a[i][j]<<' ';

cout<<endl;

}

int num=-1;

bool all_posit;

for (j=0; j<ncol; j++) { //просмотр по столбцам

all_posit=true;

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

if (a[i][j]<0) { //анализ элементов столбца

all_posit=false; break;

}

if (all_posit) {num=j; break;}

}

if (-1==num)

cout<<" Столбцов нет" <<endl;

else

cout<<"Номер столбца: "<<num<<endl;

system("pause");

return 0;

}

Порядок выполнения работы

  1. Ознакомьтесь с теоретическим материалом и в соответствии с ним создайте новый проект.

  2. Разберите все задачи теоретической части и проверьте их работоспособность в Visual C++.

  3. Сделайте задание для самостоятельного выполнения в соответствии с номером варианта.

  4. Напишите отчет в соответствии с требованиями, приведенными на стр. 20.

  5. Потренируйтесь отвечать на контрольные вопросы.

Задание для самостоятельного выполнения

Вариант 1

Дана целочисленная прямоугольная матрица (размерность матрицы и ее элементы вводить с клавиатуры). Определить:

  • количество строк, не содержащих ни одного нулевого элемента,

  • максимальное из чисел, встречающихся в заданной матрице более одного раза.

Вариант 2

Дана целочисленная прямоугольная матрица (размерность матрицы и ее элементы вводить с клавиатуры). Определить:

  • количество столбцов, не содержащих ни одного нулевого элемента,

  • минимальное из чисел, встречающихся в заданной матрице более одного раза.

Вариант 3

Дана целочисленная прямоугольная матрица (размерность матрицы и ее элементы вводить с клавиатуры). Определить:

  • количество столбцов, содержащих хотя бы один нулевой элемент,

  • номер строки, содержащей самую длинную серию одинаковых элементов.

Вариант 4

Дана целочисленная прямоугольная матрица (размерность матрицы и ее элементы вводить с клавиатуры). Определить:

  • количество строк, содержащих хотя бы один нулевой элемент,

  • номер столбца, содержащего самую длинную серию одинаковых элементов.

Вариант 5

Дана целочисленная прямоугольная матрица (размерность матрицы и ее элементы вводить с клавиатуры). Определить:

  • количество строк, содержащих только положительные элементы,

  • номер первого из столбцов, содержащих хотя бы один нулевой элемент.

Вариант 6

Дана целочисленная прямоугольная матрица (размерность матрицы и ее элементы вводить с клавиатуры). Определить:

  • количество столбцов, содержащих только положительные элементы,

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

Вариант 7

Дана целочисленная прямоугольная матрица (размерность матрицы и ее элементы вводить с клавиатуры). Определить:

  • количество строк, содержащих только отрицательные элементы,

  • номер первого из столбцов, содержащих хотя бы один положительный элемент.

Вариант 8

Дана целочисленная прямоугольная матрица (размерность матрицы и ее элементы вводить с клавиатуры). Определить:

  • количество столбцов, содержащих только отрицательные элементы,

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

Вариант 9

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

Вариант 10

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

Контрольные вопросы

  1. Как задается размерность многомерных массивов?

  2. Каким образом двумерные массивы располагаются в памяти компьютера?

  3. Как инициализируются многомерные массивы?

  4. Как создаются динамические многомерные массивы?

  5. Какой манипулятор используется для того, чтобы элементы матрицы располагались один под другим?

  6. Какой заголовочный файл необходимо подключить для использования манипулятора, устанавливающего для очередного вводимого значения ширину поля в определенноe количество символов?