Вы находитесь на странице: 1из 8

Лабораторная работа 1

Матрица как структура с функциями

Индивидуальные задания. В каждом задании предполагается, что заданы


две целые квадратные матрицы С и Т порядка n ( 2n10)

1. Пусть сумма элементов обеих диагоналей матрицы С равна S1, а сумма


элементов обеих диагоналей матрицы T равна S2. Если S1 <S2, то найти
матрицу Н=А+S1Т, иначе матрицу Z=B+S2(C+T). Здесь A- матрица порядка
n, все элементы которой равны S1; B- матрица порядка n, все элементы
которой равны S2.

2. Найти k1-количество элементов ниже побочной диагонали матрицы C,


меньших a, и k2-количество элементов ниже побочной диагонали матрицы Т,
меньших b. Если k1<k2, найти F=T+2k1C, иначе найти H=2C-k2T.

3. Найти a – сумму элементов матрицы T , лежащих на и выше главной


диагонали, и b- элементов матрицы C, лежащих на и выше главной
диагонали. Если a>b, определить H=T-abC; иначе определить F=C+aT.

4. Найти n – количество чётных чисел на главной и побочной диагонали


матрицы T и m – количество чётных чисел на главной и побочной диагонали
матрицы C.Если n<m, найти H=Tt+n*C, иначе найти F=Ct+m*T,где Tt,Ct –
транспонированные матрицы T и C, соответственно.

5. Найти k – количество нечетных чисел ниже побочной диагонали


матрицы T и m – количество нечетных чисел матрицы C.Если k>m, найти
H=(1/m)*T+C, иначе найти F=k*(C+T)+T.

6. Найти k1-количество чисел, меньших 7 в некоторой заданной строке


матицы T, k2-количество чисел, меньших 12 в некоторой заданной строке
матрицы C. Если k1<k2, найти S=T+(k1+k2)*C, иначе найти F=k1*T+k2*C.

7. Найти k1 – количество чисел на главной диагонали матрицы C, не


равных a, и k2- количество чисел на главной диагонали матрицы T, не
равных b. Если k1≠k2, найти F=C+T, иначе найти H=Ct+Tt, где Ct, Tt-
транспонированные матрицы для C и T, соответственно.

8. Если количество равных элементов в первых двух строках матрицы C


больше количества равных чисел в последних двух строках матицы T, то
найти H=T*C+2*C, иначе найти F=3*T-C*T.

9. Если количество отрицательных элементов ниже главной диагонали


матрицы C больше количества отрицательных элементов ниже главной

1
диагонали матрицы T, то найти F=C*T-Tt, иначе найти H=Ct-T*C,где Tt, Ct –
транспонированные матрицы для T и C, соответственно.

10. Пусть a – количество элементов столбца с заданным номером p


матрицы C, больших соответствующих элементов столбца с номером f
матрицы T; b –количество элементов столбца с номером f матрицы C,
больших соответствующих элементов столбца p матрицы Т. Если a>b, то
найти матрицу Z=aT+b(C+T), иначе найти H=T+(a-b)C.

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


суммы четных элементов побочной диагонали матрицы T, то найти H=T+2C,
иначе найти F=C-5T.

12. Дополнительно заданы два целых числа l и m. Если l<m, то получить


матрицу A=lT+mC и подсчитать количество положительных элементов в l-ом
столбце матрицы T; иначе получить матрицу B=12t+m2C и подсчитать
количество положительных элементов в m-ом столбце матрицы C.

13.Дополнительно заданы два целых числа m и k. Получить матрицы B=T-


k*C, D=C+m*T и найти в столбце с номером m матрицы B номер элемент,
который будет первым по порядку больше 1, найти аналогичный элемент в k-
ом столбце матрицы D.

14. Получить два вектора C1 и T1 по следующему правилу: складываются


все элементы 1-го столбца исходной матрицы – эта сумма будет первым
элементом получаемого вектора и т. П.

Получив вектор C1, указать номер элемента, который первый по порядку


будет кратен 5; аналогично – для T1.

15. Найти k1 – количество положительных чисел, кратных 5, выше главной


диагонали матрицы T и k2- количество положительных чисел, кратных 3,
выше главной диагонали матрицы C. Если k1>k2,найти F=T*C+3*C, иначе
найти H=5*T+C*T.

16. Дополнительно заданы два целых числа m и n. Если в строке с номером


m матрицы C есть отрицательные элементы, а в строке с номером n матрицы
T есть положительные элементы, то найти A=-C+T*C,иначе найти B=-
T+C*T.

17. Если S- сумма элементов последней строки и последнего столбца


матицы T больше P- суммы элементов последней строки и последнего
столбца матрицы C, то найти F=C+2T t, иначе найти H=T+5Ct.,где Tt,Сt-
транспонированные матрицы для T и C, соответственно.

2
18. Найти a – количество элементов k-ой строки матрицы T, меньших
соответствующих элементов l-ой строки матрицы C; найти b – количество
элементов l-ой строки матрицы T, меньших соответствующих элементов k-ой
строки матрицы C. Если a>b, то найти H=a*T+b*C, иначе найти F=b*T+a*C.

19. Дополнительно заданы два целых числа k и m. Найти n – количество не


равных k элементов матрицы C, и l-количество не равных m элементов
матрицы T. Если n>l, то найти H=Tt*C+k*T, иначе найти F=Ct*T+l*C, где Tt,
Ct- транспонированные матрицы для T и C, соответственно.

20. Пусть p – сумма элементов двух заданных строк матрицы T, а q –


сумма элементов двух других заданных строк матрицы C. Если p=q, то найти
D=2*T-p*C,иначе найти H=p*T=q*C.

21. Если количество нечетных элементов на обеих диагоналях матрицы T


больше количества нечетных элементов в матрице C, то найти D=E+T+C,
иначе найти H=2*E+T+3*C, где E- единичная матрица вида

1000
E= 0 1 0 0
0010
0001

22. Если произведение элементов побочной диагонали матрицы T меньше


произведения элементов побочной диагонали матрицы C, то найти H=T-
3*C+E, иначе найти F=C+2*T+2*E, где E- единичная матрица вида

1000
E= 0 1 0 0
0010
0001

23. Дополнительно заданы номера строк P,Q. Пусть SP – количество


случаев, когда соответствующие элементы строк с номером P одновременно
четны в C и T,а SQ – количество случаев, когда соответствующие элементы
строк с номером Q одновременно четны в C и T. Если SP=SQ, то получить
A=SP(C+T)+SQ E, иначе получить B=SQ(C+E)+SP T. Здесь E- единичная
матрица

1000
E= 0 1 0 0
0010
0001

24. Найти S- сумму элементов в последней строке матрицы C. Если все


элементы матрицы C больше соответствующих элементов матрицы T, то

3
найти P-сумму элементов в первой строке матрицы T и матрицу A=(S+P)C-T,
иначе найти матрицу B=nC+SnT.

Методические указания:

Функции структуры

Структуры могут содержать не только данные, но и функции. Это их


свойство на первый взгляд может показаться немного странным, но в
действительности является очень полезным. В качестве простого примера
рассмотрим следующую структуру:
struct customerName
{
public string firstName, lastName;
}
При наличии переменных типа customerName и желании вывести в
окно консоли полное имя, это имя придется собирать из отдельных частей.
Для переменной типа customerName по имени myCustomer можно
воспользоваться, например, таким синтаксисом:
customerName myCustomer;
myCustomer.firstName = "John";
myCustomer.lastName = "Franklin";
Console.WriteLine("{0} {1}",
myCustomer.firstName, myCustomer.lastName) ;
Добавив в структуру соответствующие функции, код можно упростить
для решения общих задач. В частности, добавить подходящую функцию в
структуру можно следующим образом:
struct customerName
{ public string firstName, lastName;
public string Name () {
return firstName + " " + lastName; } }
Эта функция выглядит во многом так же, как и любая другая функция;
единственное отличие состоит в том, что в ней не применяется модификатор
static.
Применить эту функцию можно следующим образом:
customerName myCustomer;
myCustomer.firstName = "John";
myCustomer.lastName = "Franklin";
Console .WriteLine (myCustomer.Name ()) ;
Такой синтаксис и гораздо проще, и понятнее предыдущего. Здесь
важно обратить внимание на то, что у функции Name () имеется прямой
доступ к таким членам структуры, как firstName и lastName. В рамках
структуры customerName они могут считаться глобальными.
Таким образом, структура, содержащая функции, является
обобщенным типом данных, инкапсулирующим в себе как данные, так и

4
функции их обработки.
Описание сложных типов данных
как структур с функциями

Рассмотрим различные обобщенные типы данных.


Матрица как тип данных
Вернемся к задачам обработки матриц, рассматриваемых в разделе
«Модульное программирование» дисциплины «Программирование на языке
высокого уровня».
Реализуем такую задачу в виде Windows-приложения, описав матрицу
как структуру с функциями ее обработки.
В качестве данных будем хранить в структуре размер матрицы и
матрицу.
Приведем условие задачи:
Заданы две матрицы целых чисел A(m,m) и B(m,m), ) где 1<m£10 .
Вычисляются P – число нулевых элементов на главной диагонали матрицы A
и Q – число нулевых элементов на главной диагонали матрицы B. Если P<Q,
то необходимо получить матрицу C(m,m), а в противном случае - матрицу
D(m,m), где

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


структуры:
inpmatr - функция формирования матрицы на экране;
chis0 - функция подсчета числа нулевых элементов на главной
диагонали матрицы;
tran - функция транспонирования матрицы;
umn - функция умножения двух матриц;
summatch - сложение матрицы с числом;
max - функция нахождения максимального элемента
матрицы.
Структура будет иметь вил:
struct matr
{ public int n;
public int[,]mat;
public void inpmatr(int nn, int[,] C)
{int i,j;
n=nn;
for (i=0;i<n;i++)
for (j=0;j<n;j++)
mat[i,j]=C[i,j];
}
//--------------------
public int max()
{int mx,i,j;mx=mat[0,0];

5
for (i=0;i<n;i++)
for (j=0;i<n;i++)
if (mat[ i, j]>mx) mx=mat [i,j];
return mx;}
//----------------
public matr tran()
{matr C;
int i,j;
C.n=n;
C.mat=new int[n,n];
for (i=0;i<n;i++)
for (j=0;j<n;j++)
C.mat[i,j]=mat[j,i];
return C;
}
public matr umn(matr D)
{matr C;
int i,j,k;
C.n=n;
C.mat=new int[n,n];
for (i=0;i<n;i++)
for (j=0;j<n;j++)
{C.mat[i,j]=0;
for (k=0;k<n;k++)
C.mat[i,j]+=mat[i,k]*D.mat[k,j];
}
return C;
}
//----------
public int chis0()
{int c=0,i;
for (i=0;i<n;i++)
if (mat[i,i]==0)
c++;
return c;}
//--------------------
public matr summatch(int ch)
{int i,j;
matr C;
C.n=n;
C.mat=new int[n,n];
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
C.mat[i, j] = mat[i, j] * ch;
return C;
6
}
}
Для размещения переменных, которые будут тоступны всем событиям,
опишем отдельный класс и назовем его Global:
class Global
{ public static matr A,B,AT,BT,C,AB,BA;
public static int[,] R;
public static int m,P,Q,max1,max2;
};
Создадим главную форму, на которой разместим поле ввода размера
матрицы, кнопку Принять и две компоненты DataGridView для ввода матриц
и вывода матриц. Форма имеет вид (рис. 27):

Рис. 27. Форма задачи обработки матриц

Пункт меню «Ввод матрицы» имеет два подпункта «Ввод первой


матрицы е« и «Ввод второй матрицы».
При нажатии кнопки «Принять» выполняется следующий
программный код:
int i;
Global.m = Convert.ToInt32(this.maskedTextBox1.Text);
Global.R = new int[Global.m, Global.m];
for (i = 0; i < Global.m; i++)
dataGridView2.Columns.Add("c" + Convert.ToString(i), "");
for (i = 0; i < Global.m; i++)
dataGridView1.Columns.Add("c" + Convert.ToString(i), "");
for (i = 0; i < Global.m; i++)
dataGridView1.Rows.Add();
for (i = 0; i < Global.m; i++)
dataGridView2.Rows.Add();
dataGridView1.AllowUserToAddRows = false;
dataGridView2.AllowUserToAddRows = false;
который размещает на экране матрицы нужного размера
Ввод любой матрицы выполняется следующим кодом (на примере
матрицы A):

7
int i, j;
Global.A.mat = new int[Global.m, Global.m];
for(i=0;i<Global.m;i++)
for (j=0;j<Global.m;j++)
Global.R[i,j]=Convert.ToInt32(this.dataGridView1[j,i].Value);
Global.A.inpmatr(Global.m,Global.R);
Вычисление и вывод результата происходит с помощью кода, который
использует функции структуры:
int i, j;
Global.P = Global.A.chis0();
Global.Q = Global.B.chis0();
if (Global.P< Global.Q)
{ Global.AT = Global.A.tran();
Global.AB = Global.AT.umn(Global.B);
Global.max1=Global.A.max();
Global.C=Global.AB.summatch(Global.max1); }
else
{ Global.BT = Global.B.tran();
Global.BA = Global.BT.umn(Global.A);
Global.max2 = Global.B.max();
Global.C = Global.BA.summatch(Global.max2); };
for(i=0;i<Global.m;i++)
for (j=0;j<Global.m;j++)
this.dataGridView2[j, i].Value=Convert.ToString(Global.C.mat[i,j]);

Вам также может понравиться