Читайте также:
|
|
Дана целочисленная прямоугольная матрица. Определить количество отрицательных элементов в тех строках, которые содержат хотя бы один нулевой элемент. UML-диаграмма этого алгоритма приведена на рисунке 6.8.
Рисунок 6.8 - UML-диаграмма деятельности для примера 6.5
Листинг 6.6
#include "stdafx.h"
#include <conio.h>
#include <windows.h>
#include <math.h>
#include <iostream>
#include <time.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL, "Russian");
srand((unsigned)time(NULL));
int m,n,h,c,i,j,ch;
cout << "Лабораторная работа № 6\n";
cout << "\nЗадание\nДана целочисленная прямоугольная матрица. Определить:\ количество отрицательных элементов в тех строках,\nкоторые содержат хотя бы один нулевой элемент.";
cout << "\n Введите размерность массива\n";
cin >> n;
cin >> m;
int **a = new int *[n];
for(i = 0; i < n; i++) a[i] = new int [m];
cout << "\nВыберите способ ввода массива";
cout << "\n1. Ввести массив с клавиатуры.\n2. Заполнить массив случайным образом.\n";
cin>>ch;
if (ch==1)
{
cout << "\n Введите элементы массива\n"<<endl;
for(i = 0; i < n; i++)
for(j = 0; j < m; j++) cin >> a[i][j];
for(i = 0; i < n; i++)
{
for(j = 0; j < m; j++)
cout << a[i][j] << ' ';
cout << endl;
}
}
if (ch == 2)
{
for(i = 0; i < n; i++)
for(j = 0; j < m; j++) a[i][j]=rand()%20;
for(i = 0; i < n; i++)
{
for(j = 0; j < m; j++)
cout << a[i][j] << ' ';
cout << endl;
}
}
h = 0;
for(i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
if (a[i][j] < 0)
h++;
for (j = 0; j < m; j++)
if (a[i][j] == 0)
{
cout << "\nНомер строки\n" << i;
cout << "\nЧисло отрицательных элементов\n" << h;
h = 0;
}
else
cout << "\nНет нулевых элементов\n";
}
getch();
return 0;
}
Аппаратура и материалы. Для выполнения лабораторной работы необходим персональный компьютер со следующими характеристиками: процессор Intel Pentium-совместимый с тактовой частотой 800 МГц и выше, оперативная память - не менее 64 Мбайт, свободное дисковое пространство - не менее 500 Мбайт, устройство для чтения компакт-дисков, монитор типа Super VGA (число цветов от 256) с диагональю не менее 15². Программное обеспечение - операционная система Windows2000/XP и выше, среда разработки приложений Microsoft Visual Studio.
Указания по технике безопасности. Техника безопасности при выполнении лабораторной работы совпадает с общепринятой для пользователей персональных компьютеров, самостоятельно не производить ремонт персонального компьютера, установку и удаление программного обеспечения; в случае неисправности персонального компьютера сообщить об этом обслуживающему персоналу лаборатории (оператору, администратору); соблюдать правила техники безопасности при работе с электрооборудованием; не касаться электрических розеток металлическими предметами; рабочее место пользователя персонального компьютера должно содержаться в чистоте; не разрешается возле персонального компьютера принимать пищу, напитки.
Методика и порядок выполнения работы. Перед выполнением лабораторной работы каждый студент получает индивидуальное задание. Защита лабораторной работы происходит только после его выполнения (индивидуального задания). При защите лабораторной работы студент отвечает на контрольные вопросы, приведенные в конце, и поясняет выполненное индивидуальное задание. Ход защиты лабораторной работы контролируется преподавателем.Порядок выполнения работы:
1.Проработать примеры, приведенные в лабораторной работе.
2. Составить программу с использованием двумерных локальных массивов для решения задачи. Размерности локальных массивов задавать именованными константами, значения элементов массива - в списке инициализации. Номер варианта определяется по формуле , где - номер студента по списку преподавателя.
Индивидуальное задание №1. Вариант:
1. Дана целочисленная прямоугольная матрица. Определить:
1) количество строк, не содержащих ни одного нулевого элемента;
2) максимальное из чисел, встречающихся в заданной матрице более одного раза.
2. Дана целочисленная прямоугольная матрица. Определить количество столбцов, не содержащих ни одного нулевого элемента.
Характеристикой строки целочисленной матрицы назовем сумму ее положительных четных элементов. Переставляя строки заданной матрицы, расположить их в соответствии с ростом характеристик.
3. Дана целочисленная прямоугольная матрица. Определить:
1) количество столбцов, содержащих хотя бы один нулевой элемент;
2) номер строки, в которой находится самая длинная серия одинаковых элементов.
4. Дана целочисленная квадратная матрица. Определить:
1) произведение элементов в тех строках, которые не содержат отрицательных элементов;
2) максимум среди сумм элементов диагоналей, параллельных главной диагонали матрицы.
5. Дана целочисленная квадратная матрица. Определить:
1) сумму элементов в тех столбцах, которые не содержат отрицательных элементов;
2) минимум среди сумм модулей элементов диагоналей, параллельных побочной диагонали матрицы.
6. Для заданной матрицы размером 8 на 8 найти такие k, что k -я строка матрицы совпадает с k-м столбцом.
Найти сумму элементов в тех строках, которые содержат хотя бы один отрицательный элемент.
7. Характеристикой столбца целочисленной матрицы назовем сумму модулей его отрицательных нечетных элементов. Переставляя столбцы заданной матрицы, расположить их в соответствий с ростом характеристик.
Найти сумму элементов в тех столбцах, которые содержат хотя бы один отрицательный элемент.
8. Соседями элемента Aj в матрице назовем элементы Аk с i - 1 < k < i+1, j-1 < 1 < j + 1, (k, 1) / (i, j). Операция сглаживания матрицы дает новую матрицу того же размера, каждый элемент которой получается как среднее арифметическое имеющихся соседей соответствующего элемента исходной матрицы. Построить результат сглаживания заданной вещественной матрицы размером 7 на 7. В сглаженной матрице найти сумму модулей элементов, расположенных ниже главной диагонали.
9. Элемент матрицы называется локальным минимумом, если он строго меньше всех имеющихся у него соседей. Подсчитать количество локальных минимумов заданной матрицы размером 10 на 10.
Найти сумму модулей элементов, расположенных выше главной диагонали.
10. Коэффициенты системы линейных уравнений заданы в виде прямоугольной матрицы. С помощью допустимых преобразований привести систему к треугольному виду. Найти количество строк, среднее арифметическое элементов которых меньше заданной величины.
11. Уплотнить заданную матрицу, удаляя из нее строки и столбцы, заполненные нулями. Найти номер первой из строк, содержащих хотя бы один положительный элемент.
12. Осуществить циклический сдвиг элементов прямоугольной матрицы на п элементов вправо или вниз (в зависимости от введенного режима), п может быть больше количества элементов в строке или столбце.
13. Осуществить циклический сдвиг элементов квадратной матрицы размерности М х N вправо на к элементов таким образом: элементы 1-й строки сдвигаются в последний столбец сверху вниз, из него - в последнюю строку справа налево, из нее - в первый столбец снизу вверх, из него - в первую строку; для остальных элементов - аналогично.
14. Дана целочисленная прямоугольная матрица. Определить номер первого из столбцов, содержащих хотя бы один нулевой элемент.
Характеристикой строки целочисленной матрицы назовем сумму ее отрицательных четных элементов. Переставляя строки заданной матрицы, расположить их в соответствии с убыванием характеристик.
15. Упорядочить строки целочисленной прямоугольной матрицы по возрастанию количества одинаковых элементов в каждой строке.
Найти номер первого из столбцов, не содержащих ни одного отрицательного элемента.
16. Путем перестановки элементов квадратной вещественной матрицы добиться того, чтобы ее максимальный элемент находился в левом верхнем углу, следующий по величине - в позиции (2,2), следующий по величине - в позиции (3,3) и т. д., заполнив таким образом всю главную диагональ. Найти номер первой из строк, не содержащих ни одного положительного элемента.
17. Дана целочисленная прямоугольная матрица. Определить:
1) количество строк, содержащих хотя бы один нулевой элемент;
2) номер столбца, в котором находится самая длинная серия одинаковых элементов.
18. Дана целочисленная квадратная матрица. Определить:
1) сумму элементов в тех строках, которые не содержат отрицательных элементов;
2) минимум среди сумм элементов диагоналей, параллельных главной диагонали матрицы.
19. Дана целочисленная прямоугольная матрица. Определить:
1) количество положительных элементов в тех строках, которые не содержат нулевых элементов;
2) номера строк и столбцов всех седловых точек матрицы.
Примечание. Матрица А имеет седловую точку АР если АР является минимальным элементом в i-й строке и максимальным в j-м столбце.
3. Составить программу с использованием двумерных динамических массивов для решения задачи согласно варианту индивидуального задания №1.
Содержание отчета и его форма. Отчет по лабораторной работе должен состоять из:
1. Названия лабораторной работы.
2. Цели и содержания лабораторной работы.
3. Ответов на контрольные вопросы лабораторной работы.
4. Формулировки индивидуальных заданий и порядка их выполнения.
Отчет о выполнении лабораторной работы в письменном виде сдается преподавателю.
Вопросы для защиты работы
1. Как представляется в C++ двумерный массив?
2. Где и каким образом хранится двумерный массив?
3. В каких пределах изменяются индексы двумерного массива?
4. Какими способами можно описать двумерный массив?
5. Какие действия выполняются для каждой строки при вычислении количества положительных элементов?
6. В каком месте программы следует записывать операторы инициализации накапливаемых в цикле величин?
7. Каким образом в динамической области памяти можно создавать двумерные массивы?
8. Способы создания динамического массива.
9. Каким образом производится обращение к элементам динамических массивов?
Пример выполнения лабораторной работы №6:
1. Индивидуальное задание №1:
1.1. Постановка задачи:
Составить программу с использованием двумерных локальных массивов для решения задачи. Размерности локальных массивов задавать именованными константами, значения элементов массива - в списке инициализации.
Задача: дана целочисленная прямоугольная матрица. Определить:
1) сумму элементов в тех строках, которые содержат хотя бы один отрицательный элемент;
2) номера строк и столбцов всех седловых точек матрицы.
Примечание. Матрица А имеет седловую точку As, если As является минимальным элементом в i-й строке и максимальным в j-м столбце.
1.2. UML-диаграмма:
1.3. Листинг программы:
// Лабораторная работа №6
// Индивидуальное задание №1
#include "stdafx.h"
#include <iostream>
#include "conio.h"
#include "math.h"
#include "windows.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL, "Russian");
const int nrow = 3, ncol = 5;
int A[nrow][ncol];
int i, j, summ;
cout<<"Лабораторная работа № 6\n"
<<"\nГорошко А.А., БАС-051\n"
<<"\nВариант № 6\n"
<<"\n\nИндивидуальное задание № 1:\n"
<<"\nСоставить программу с использованием двумерных локальных массивов для\n"
<<"\nрешения задачи. Размерности локальных массивов задавать именованными\n"
<<"\nконстантами, значения элементов массива - в списке инициализации.\n"
<<"\n\nЗадача: дана целочисленная прямоугольная матрица. Определить:\n"
<<"сумму элементов в тех строках, которые содержат хотя бы один\n"
<<"\nотрицательный элемент;\n"
<<"\n2) номера строк и столбцов всех седловых точек матрицы.\n"
<<"\n\nПримечание: матрица А имеет седловую точку As, если Аs является\n"
<<"\nминимальным элементом в i-й строке и максимальным в j-м столбце.\n"
<<"\n\nРабота программы:\n"
<<"\nВведите элементы массива: \n\n";
for (i = 0; i < nrow; i++)
{
for (j = 0; j < ncol; j++)
{
cout << "A[" << i << "][" << j << "] = ";
cin >> A[i][j];
}
}
cout << "\n1) ";
for (i = 0; i < nrow; i++)
{
bool flag = false;
summ = 0;
for (j = 0; j < ncol; j++)
{
summ += A[i][j];
if(A[i][j] < 0)
flag = true;
}
if(flag == true)
{
cout<<"Сумма элементов строки "<< i;
cout<<" с отрицательным элементом"<< " = " << summ << "\n\n";
}
}
cout<<"\n2) ";
for (i = 0; i < nrow; i++)
{
int min, max;
int tempValue; // временная переменная
min = 0;
tempValue = A[i][0];
// поиск минимального в строке элемента
for (j = 0; j < ncol; j++)
{
if(A[i][j] < tempValue)
{
min = j;
tempValue = A[i][j];
}
}
// поиск максимального в столбце элемента
max = 0;
tempValue = A[0][min];
for(j = 0; j < nrow; j++)
{
if(A[j][min] > tempValue)
{
max = j;
tempValue = A[j][min];
}
}
if(i == max)
{
cout<<"Седловая точка: "<< "As[" << max << "][" << min << "]";
}
}
getch();
return 0;
}
1.4. Результаты работы программы:
2. Индивидуальное задание №2:
2.1. Постановка задачи:
Составить программу с использованием двумерных динамических массивов для решения задачи индивидуального задания №1.
2.2. UML-диаграмма:
2.3. Листинг программы:
// Лабораторная работа №6
// Индивидуальное задание №2
#include "stdafx.h"
#include <iostream>
#include "conio.h"
#include "math.h"
#include "windows.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL, "Russian");
int nrow, ncol, i, j, summ;
cout<<"Лабораторная работа № 6\n";
cout<<"\nГорошко А.А., БАС-051\n";
cout<<"\nВариант № 6\n";
cout<<"\n\nИндивидуальное задание № 2:\n";
cout<<"\nСоставить программу с использованием двумерных динамических\n";
cout<<"\nмассивов для решения задачи индивидуального задания №1.\n";
cout<<"\n\nРабота программы:\n";
cout<<"\nВведите количество строк и столбцов:\n\n"<< "i = ";
cin >> nrow;
cout<< "j = ";
cin >> ncol;
int **A = new int *[nrow];
cout<<"\nВведите элементы массива: \n\n";
for (i = 0; i < nrow; i++)
{
A[i] = new int[ncol];
for (j = 0; j < ncol; j++)
{
cout << "A[" << i << "][" << j << "] = ";
cin >> A[i][j];
}
}
cout<<"\n1) ";
for (i = 0; i < nrow; i++)
{
bool flag = false;
summ = 0;
for (j = 0; j < ncol; j++)
{
summ += A[i][j];
if(A[i][j] < 0)
flag = true;
}
if(flag == true)
{
cout<<"Сумма элементов строки "<< i;
cout<<" с отрицательным элементом"<< " = " << summ << "\n\n";
}
}
cout<<"\n2) ";
for (i = 0; i < nrow; i++)
{
int min, max;
int tempValue; // временная переменная
min = 0;
tempValue = A[i][0];
// поиск минимального в строке элемента
for (j = 0; j < ncol; j++)
{
if(A[i][j] < tempValue)
{
min = j;
tempValue = A[i][j];
}
}
// поиск максимального в столбце элемента
max = 0;
tempValue = A[0][min];
for(j = 0; j < nrow; j++)
{
if(A[j][min] > tempValue)
{
max = j;
tempValue = A[j][min];
}
}
if(i == max)
{
cout<<"Седловая точка: "<< "As[" << max << "][" << min << "]";
}
}
getch();
return 0;
}
2.4. Результаты работы программы:
Лабораторная работа №7.
Функции и перегрузка в языке C++
Цель работы и содержание: закрепление знаний о функциях и перегрузке, составление программ с функциями и перегрузкой.
Ход работы
Основные сведения о функциях в языке С++. Функция - это группа операторов, выполняющая законченное действие. К функции можно обратиться по имени, передать ей значения и получить из нее результат.
Функции нужны для упрощения структуры программы. Передача в функцию различных аргументов позволяет, записав ее один раз, использовать многократно для разных данных. Чтобы использовать функцию, не требуется знать, как она работает - достаточно знать, как ее вызвать.
Для использования функции тоже требуется знать только ее интерфейс. Интерфейс грамотно написанной функции определяется ее заголовком, потому что в нем указывается все, что необходимо для ее вызова: имя функции, тип результата, который она возвращает, а также сколько аргументов и какого типа ей нужно передать.
Формат простейшего заголовка (прототипа) функции:
тип имя ([список параметров]);
В квадратных скобках записано то, что может быть опущено. Например, заголовок функции main обычно имеет вид:
int mainO;
Это означает, что никаких параметров этой функции извне не передается, а возвращает она одно значение типа int (код завершения). Функция может и не возвращать никакого значения, в этом случае должен быть указан тип void. Вот, к примеру, заголовок стандартной библиотечной функции, вычисляющей синус угла:
double sin (double);
Здесь записано, что функция имеет имя sin, вычисляет значение синуса типа double, и для этого нужно передать ей аргумент типа double. А вот заголовок функции memcpy, копирующей блок памяти длиной n байтов, начиная с адреса src, по адресу dest:
void *memcpy (void *dest,const void *src,size t n);
Эта функция возвращает указатель неопределенного типа на начало области памяти, в которую выполнялось копирование. Какой именно смысл имеет каждый из параметров функции, описывается в документации на функцию. Имена параметров при записи прототипа функции имеют чисто декоративное значение, то есть они могут понадобиться нам, а не компилятору, поэтому их можно опускать:
void *memcpy(void *, const void *. size t);
Неграмотно написанная функция наряду с аргументами использует и глобальные переменные, которые доступны из любого блока текущего файла. Поскольку это никак не отражается на заголовке, для использования такой функции требуется исследовать и ее текст.
Все, что передается в функцию и обратно, должно отражаться в ее заголовке. Это требование не синтаксиса, а хорошего стиля.
Заголовок задает объявление функции. Определение функции, кроме заголовка, включает ее тело, то есть те операторы, которые выполняются при вызове функции, например:
int sum(int a,int b) /* функция находит сумму двух значений */
{
return a + b; // тело функции
}
В тексте программы может содержаться произвольное количество объявлений одной и той же функции и только одно определение (в этом функции не отличаются от других программных объектов). Тело функции представляет собой блок, заключенный в фигурные скобки. Для возврата результата, вычисленного в функции, служит оператор return. После него указывается выражение, результат вычисления которого и передается в точку вызова функции. Результат при необходимости преобразуется по общим правилам к типу, указанному в заголовке. Функция может иметь несколько операторов возврата, это определяется алгоритмом.
Для того чтобы вызвать функцию, надо указать ее имя, а также передать ей набор аргументов в соответствии с указанным в ее заголовке.
Вызов функции, возвращающей значение определенного типа (то есть не имеющей тип void), может быть записан в любом месте, где по синтаксису допустимо выражение - в правой части оператора присваивания, в составе выражения, в цепочке вывода и так далее. Вот, например, как можно вызвать функции, приведенные выше:
double y, x1 = 0.34, x2 = 2;
y = sin (x1);
cout << y << ‘ ‘ << sin (x2) << endl;
y = sin (x1 + 0.5) - sin(x1 - 0.5);
char *cite = “ Never say never ”;
char b [100];
memcpy (b, cite, strlen(cite) + 1);
int summa, a = 2;
summa = sum(a, 4);
В определении, в объявлении и при вызове одной и той же функции типы и порядок следования параметров должны совпадать. Для имен параметров никакого соответствия не требуется.
Дата добавления: 2015-10-26; просмотров: 1121 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Пример 6.4. Сглаживание заданной вещественной матрицы, работа с файлами | | | Пример 7.1. Передача в функцию параметров стандартных типов |