Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб1(Книга).doc
Скачиваний:
7
Добавлен:
23.12.2018
Размер:
369.66 Кб
Скачать

9. Матрицы (двухмерные массивы)

1. Составить следующие функции для работы с матрицей: ввод матрицы; вывод; сортировка строк матрицы по возрастанию значений k-го столбца; транспонирование матрицы с сохранением результата на новом месте; умножение исходной рассортированной матрицы на транспонированную; головную функцию для проверки этих функций.

const int n2=3;

void INP1(double x[][n2] , int );

void OUT1(double x[][n2], int );

void SORT1(double x[][n2], int , int );

void TRANS(double x[][n2], double y[][n2], int );

void MULT(double x[][n2], double y[][n2], double z[][n2], int );

int main()

{ const int size=3; int k;

double a[size][n2],b[size][n2],c[size][n2]; INP1(a,size);

cout<<"\nOld matrix\n"; OUT1(a,size);

cout <<"\nInput the number of collumn for sorting =>";

while(1) // Ввод номера столбца с проверкой правильности ввода

{ cin>>k;

if (k>=0 && k<n2) break;

cout<<"k>=0 && k<"<<n2<<" Repeat ";

}

SORT1(a,size,k); cout<<"\nMatrix after sorting\n"; OUT1(a,size);

TRANS(a,b,size); cout<<"\nTrans matrix \n"; OUT1(b,size);

MULT(a,b,c,size); cout<<"\nMultiplication \n"; OUT1(c,size);

getch(); return 0;

}

void TRANS(double x[][n2], double y[][n2], int n)

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

for(int j=0; j<n2; j++)

y[i][j]=x[j][i];

}

void MULT(double x[][n2], double y[][n2], double z[][n2], int n)

{ int l, i, j, s;

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

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

{ s=0;

for (l=0; l<n2; l++)

s+=x[i][l]*y[l][j];

z[i][j]=s;

}

}

void SORT1(double x[][n2], int n, int k)

{ int i,j,m,mn,N;

for (m=0;m<n-1;m++)

{ mn=x[m][k]; N=m;

for (i=m+1;i<n;i++)

if (x[i][k]<mn)

{ mn=x[i][k];

N=i;

}

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

{ double t; t=x[m][j];

x[m][j]=x[N][j]; x[N][j]=t;

}

}

}

void OUT1(double x[][n2], int n)

{ int X,j,Y=wherey();

for (int i=0; i<n; i++, Y++)

for (X=1, j=0; j<n2; j++, X+=7)

{ gotoxy(X,Y);

cout<<x[i][j];

}

cout<<endl;

}

void INP1(double x[][n2],int n)

{ int Y=1,X;

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

{ Y++; X=-14;

for (int j=0; j<n2; j++)

{ X+=16; gotoxy(X,Y);

cout<<"a["<<i<<","<<j<<"]"<<" ";

cin>>x[i][j];

}

}

}

2. Составить класс для работы с целочисленной матрицей, включив в него матрицу, конкретные текущие размерности и следующие методы: конструктор для ввода и проверки текущих размерностей матрицы; ввод матрицы; вывод матрицы; поиск наибольшего и наименьшего значений матрицы и номеров строк, где они находятся; перестановка двух строк матрицы. В головной функции ввести размерности матрицы, создать объект и проверить составленные методы.

const n1max=10, n2max=5;

class ClMatr

{ int a[n1max][n2max], n1, n2;

public:

ClMatr(int size1=5, int size2=3)

{ if (size1>0 && size1<n1max)

n1=size1;

else n1=5;

if (size2>0 && size2<n2max)

n2=size2;

else n2=3;

}

void MyInp();

void MyOut();

void MaxMin(int &, int &, int &, int &);

void Change(int, int);

};

void ClMatr::MyInp()

{ int x, y=1;

for (int i=0; i<n1; i++)

{ y++; x=-14;

for (int j=0; j<n2; j++)

{ x+=16; gotoxy(x,y);

cout<<"a["<<i<<","<<j<<"]"<<" ";

cin>>a[i][j];

}

}

};

void ClMatr::MyOut()

{ int x, y=wherey()+1, j;

for (int i=0; i<n1; i++, y++)

for (x=1, j=0; j<n2; j++, x+=7)

{ gotoxy(x,y);

cout<<a[i][j];

}

cout<<endl;

}

void ClMatr::MaxMin(int &max, int &Nmax, int &min, int &Nmin)

{ max=min=a[0][0]; Nmax=Nmin=0;

for (int i=0;i<n1;i++)

for (int j=0;j<n2;j++)

if (max<a[i][j])

{ max=a[i][j]; Nmax=i;

}

else if (min>a[i][j])

{ min=a[i][j]; Nmin=i;

}

}

void ClMatr::Change(int k1, int k2)

{ int d;

if (k1!=k2)

for (int j=0; j<n2; j++)

{ d=a[k1][j]; a[k1][j]=a[k2][j];

a[k2][j]=d;

}

}

int main()

{ int n1, n2, Nmax, Nmin, max, min; clrscr();

cout<<"\nn1="; cin>>n1; cout<<" n2="; cin>>n2;

ClMatr ob(n1,n2); clrscr();

ob.MyInp(); cout<<"\nOld matrix\n"; ob.MyOut();

ob.MaxMin(max,Nmax,min,Nmin);

cout<<"Max element= "<<max <<" in "<< Nmax << " row\n";

cout<<"Min element= "<<min <<" in "<< Nmin << " row\n";

if (Nmax!=Nmin)

{ ob.Change(Nmax,Nmin);

cout<<"Matrix after changing "; ob.MyOut();

}

else cout<<"Matrix is not changed \n";

getch(); return 0;

}

Замечания.

1) Во всех задачах предполагается, что матрица имеет фиксированную размерность, при этом количество строк и столбцов – константы.

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

Обработка строк матрицы

3. В каждой строке матрицы найти указанные величины и из них построить один или два одномерных массива, размерности которых соответствуют количеству строк матрицы:

    1. среднее значение среди положительных и среднее значение среди отрицательных элементов;

б) второй наибольший элемент и его номер в строке. Если вторых наибольших элементов в строке несколько, найти номер первого из них;

в) сумму чисел до первого положительного числа, включая его;

г) есть ли нуль в строке. Получить 1, если есть и 0 в противном случае;

д) первый отрицательный элемент и его номер. Если отрицательных чисел в строке нет, получить соответственно 0 и -1.

4. В матрице найти сумму наибольших элементов строк, наибольшую сумму элементов строк и номер такой строки (любой, если несколько строк имеют наибольшую сумму).

  1. Найти наибольший среди наименьших элементов строк и наименьший среди наибольших элементов строк.

  2. В матрице найти количество строк, у которых

  1. все нули;

б) есть хотя бы один нуль и номер первой такой строки.

  1. Дана матрица A, в которой Ai,j – оценка i-го студента на j-м экзамене по 10-балльной системе. Фамилии и названия предметов в памяти не хранятся.

a) Найти количество отличников, т. е. количество строк, в которых только 9 и (или) 10. При выводе такие строки выделить другим цветом.

b) Найти количество двоечников, т. е. количество строк, в которых есть 1 и (или) 2.

  1. Умножить матрицу на вектор (одномерный массив).

Обработка матрицы по столбцам

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

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

Обработка всей матрицы

  1. Это же (см. 3), т. е. одно или два числа найти для всей матрицы в целом.

  2. Даны матрицы A и B одинаковой размерности. Вычислить

 наименьшее среди положительных чисел матрицы.

  1. Умножить две матрицы, проверив согласованность их размерностей.

Обработка части матрицы (диагонали, треугольника и т.п.)

  1. Дана квадратная целочисленная матрица. Найти количество простых чисел и количество чисел, у которых в двоичном представлении нет нулей:

  1. на главной диагонали;

  2. на побочной диагонали;

  3. в левом нижнем треугольнике относительно главной диагонали;

  4. в правом нижнем треугольнике относительно побочной диагонали;

  5. в верхнем треугольнике относительно главной и побочной диагонали;

  6. в правом треугольнике относительно побочной и главной диагонали.

Преобразование матрицы, в том числе сортировка

14. Числа заданной матрицы, принадлежащие отрезку [a, b], увеличить в 100 раз, остальные уменьшить в 2 раза. Измененную матрицу оставить на том же месте.

15. В каждой строке матрицы поменять местами наибольший с наименьшим элементом. Если в строке несколько наибольших элементов и (или) несколько наименьших, то поменять местами первый наибольший с последним наименьшим этой строки.

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

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

    2. Из матрицы “удалить” строку и столбец, на пересечении которых находится наибольший элемент всей матрицы, “подтянув” элементы матрицы к левому верхнему углу. Элементам последней строки и последнего столбца присвоить нулевое значение.

    3. Транспонировать квадратную матрицу, оставив новую матрицу на том же месте.

    4. Каждую строку матрицы рассортировать по возрастанию элементов строк.

    5. Рассортировать строки целочисленной матрицы по следующему параметру строки:

      1. количеству четных чисел;

б) количеству чисел, у которых первая слева цифра четная;

в) наибольшей сумме цифр чисел строки;

г) сумме наибольших цифр чисел строки;

д) наибольшему элементу строки.

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

Построение матриц

22. Даны два массива A и B одинаковой размерности. Построить квадратную матрицу такой же размерности по формуле .

23. Даны две матрицы A и B одинаковой размерности. Построить матрицу С по правилу:

24. Дан одномерный массив b размерности m. Построить матрицу

25. Дано число x. Построить матрицу

Матрицы специального вида

  1. Дана треугольная матрица, т. е. такая квадратная матрица, в которой все элементы, расположенные выше главной диагонали, имеют одинаковые значения, например нуль. Записать такую матрицу в одномерный массив размерности n(n+1)/2, где n – количество строк и столбцов матрицы, сохранив в нем только элементы, расположенные выше главной диагонали. Вывести такой одномерный массив в виде матрицы, выводя и одинаковые (например, нулевые) ее значения.

  2. Решить такую же задачу (см. 26), если матрица является треугольной относительно побочной диагонали.

  3. Квадратная матрица A называется симметричной относительно главной диагонали, если Aij = Aji для i<j. Записать такую матрицу в одномерный массив размерности nn+1)/2, где n – количество строк и столбцов матрицы, сохранив в нем элементы главной диагонали и расположенные выше ее. Вывести такой одномерный массив в виде симметричной матрицы.

  4. Решить такую же задачу (см. 28), если матрица симметрична относительно побочной диагонали.

30 – 31. Найти произведение вектор-строки на симметричную относительно главной (побочной) диагонали матрицу.

32 – 33. Найти произведение симметричной относительно главной (побочной) диагонали матрицы на вектор-столбец.

34 – 37. Найти сумму (произведение) двух матриц, первая из которых симметрична относительно главной (побочной) диагонали.

38– 41. Найти сумму (произведение) двух матриц, симметричных относительно главной (побочной) диагонали.

С О Д Е Р Ж А Н И Е

1. Рабочая программа курса “Методы программирования” ……….. 3

  1. Разветвляющиеся алгоритмы. Ввод, вывод ……………………... 6

  2. Циклические алгоритмы ………………………………………….. 8

  3. Одномерные массивы (векторы) …………………………………. 12

  4. Функции с одним результатом ………………………………….…16

  5. Функции типа void ………………………………………………... 21

  6. Введение в объектно-ориентированное программирование …… 27

  7. Простые типы данных …………………………………………….. 36

  8. Матрицы (двухмерные массивы) ………………………………… 41

Учебное издание

Аленский Николай Алексеевич