- •1. Рабочая программа курса “методы программирования ”
- •Литература
- •2. Разветвляющиеся алгоритмы.
- •Циклические алгоритмы
- •Одномерные массивы (векторы)
- •Функции с одним результатом
- •Функции типа void.
- •7. Введение в объектно-ориентированное программирование
- •8. Простые типы данных
- •9. Матрицы (двухмерные массивы)
- •Сборник задач по программированию
- •Учебно-методическое пособие для студентов специальностей g 31 03 01 “Математика”, g 31 03 03 “Механика”
- •220050, Минск, проспект Франциска Скорины, 4.
- •220030, Минск, ул. Красноармейская, 6.
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) Во всех задачах предполагается, что матрица имеет фиксированную размерность, при этом количество строк и столбцов – константы.
-
В зависимости от способностей студентов задания выполняются в модульном и (или) объектно-ориентированном стиле, что влияет на оценку. Каждый проект необходимо разбить на несколько функций (методов).
Обработка строк матрицы
3. В каждой строке матрицы найти указанные величины и из них построить один или два одномерных массива, размерности которых соответствуют количеству строк матрицы:
-
среднее значение среди положительных и среднее значение среди отрицательных элементов;
б) второй наибольший элемент и его номер в строке. Если вторых наибольших элементов в строке несколько, найти номер первого из них;
в) сумму чисел до первого положительного числа, включая его;
г) есть ли нуль в строке. Получить 1, если есть и 0 в противном случае;
д) первый отрицательный элемент и его номер. Если отрицательных чисел в строке нет, получить соответственно 0 и -1.
4. В матрице найти сумму наибольших элементов строк, наибольшую сумму элементов строк и номер такой строки (любой, если несколько строк имеют наибольшую сумму).
-
Найти наибольший среди наименьших элементов строк и наименьший среди наибольших элементов строк.
-
В матрице найти количество строк, у которых
-
все нули;
б) есть хотя бы один нуль и номер первой такой строки.
-
Дана матрица A, в которой Ai,j – оценка i-го студента на j-м экзамене по 10-балльной системе. Фамилии и названия предметов в памяти не хранятся.
a) Найти количество отличников, т. е. количество строк, в которых только 9 и (или) 10. При выводе такие строки выделить другим цветом.
b) Найти количество двоечников, т. е. количество строк, в которых есть 1 и (или) 2.
-
Умножить матрицу на вектор (одномерный массив).
Обработка матрицы по столбцам
-
Это же (см. 3) найти для каждого столбца матрицы и построить один или два одномерных массива, размерности которых соответствуют количеству столбцов матрицы.
Замечание. По возможности обработку матрицы по столбцам желательно избегать, так как элементы матрицы в памяти располагаются по строкам и выбор элементов столбца занимает много времени.
Обработка всей матрицы
-
Это же (см. 3), т. е. одно или два числа найти для всей матрицы в целом.
-
Даны матрицы A и B одинаковой размерности. Вычислить
наименьшее среди положительных чисел матрицы.
-
Умножить две матрицы, проверив согласованность их размерностей.
Обработка части матрицы (диагонали, треугольника и т.п.)
-
Дана квадратная целочисленная матрица. Найти количество простых чисел и количество чисел, у которых в двоичном представлении нет нулей:
-
на главной диагонали;
-
на побочной диагонали;
-
в левом нижнем треугольнике относительно главной диагонали;
-
в правом нижнем треугольнике относительно побочной диагонали;
-
в верхнем треугольнике относительно главной и побочной диагонали;
-
в правом треугольнике относительно побочной и главной диагонали.
Преобразование матрицы, в том числе сортировка
14. Числа заданной матрицы, принадлежащие отрезку [a, b], увеличить в 100 раз, остальные уменьшить в 2 раза. Измененную матрицу оставить на том же месте.
15. В каждой строке матрицы поменять местами наибольший с наименьшим элементом. Если в строке несколько наибольших элементов и (или) несколько наименьших, то поменять местами первый наибольший с последним наименьшим этой строки.
16. Поменять местами строки матрицы, в которых находятся первое отрицательное число первого столбца и последнее положительное число этого же столбца. Если в первом столбце нет отрицательных чисел, то первую строку матрицы поменять местами с той, в которой находится последнее положительное число первого столбца. Если в первом столбце нет положительных чисел, то последнюю строку матрицы поменять местами с той, в которой находится первое отрицательное число первого столбца..
-
В квадратной матрице поменять местами строку и столбец, на пересечении которых находится наибольший элемент всей матрицы. Если наибольших чисел несколько, то переставить строку с наименьшим индексом со столбцом с наибольшим индексом.
-
Из матрицы “удалить” строку и столбец, на пересечении которых находится наибольший элемент всей матрицы, “подтянув” элементы матрицы к левому верхнему углу. Элементам последней строки и последнего столбца присвоить нулевое значение.
-
Транспонировать квадратную матрицу, оставив новую матрицу на том же месте.
-
Каждую строку матрицы рассортировать по возрастанию элементов строк.
-
Рассортировать строки целочисленной матрицы по следующему параметру строки:
-
количеству четных чисел;
-
б) количеству чисел, у которых первая слева цифра четная;
в) наибольшей сумме цифр чисел строки;
г) сумме наибольших цифр чисел строки;
д) наибольшему элементу строки.
Замечание. Для решения подобных задач эффективнее использовать указатели и динамические матрицы, которые рассматриваются во втором семестре.
Построение матриц
22. Даны два массива A и B одинаковой размерности. Построить квадратную матрицу такой же размерности по формуле .
23. Даны две матрицы A и B одинаковой размерности. Построить матрицу С по правилу:
24. Дан одномерный массив b размерности m. Построить матрицу
25. Дано число x. Построить матрицу
Матрицы специального вида
-
Дана треугольная матрица, т. е. такая квадратная матрица, в которой все элементы, расположенные выше главной диагонали, имеют одинаковые значения, например нуль. Записать такую матрицу в одномерный массив размерности n∙(n+1)/2, где n – количество строк и столбцов матрицы, сохранив в нем только элементы, расположенные выше главной диагонали. Вывести такой одномерный массив в виде матрицы, выводя и одинаковые (например, нулевые) ее значения.
-
Решить такую же задачу (см. 26), если матрица является треугольной относительно побочной диагонали.
-
Квадратная матрица A называется симметричной относительно главной диагонали, если Aij = Aji для i<j. Записать такую матрицу в одномерный массив размерности n∙n+1)/2, где n – количество строк и столбцов матрицы, сохранив в нем элементы главной диагонали и расположенные выше ее. Вывести такой одномерный массив в виде симметричной матрицы.
-
Решить такую же задачу (см. 28), если матрица симметрична относительно побочной диагонали.
30 – 31. Найти произведение вектор-строки на симметричную относительно главной (побочной) диагонали матрицу.
32 – 33. Найти произведение симметричной относительно главной (побочной) диагонали матрицы на вектор-столбец.
34 – 37. Найти сумму (произведение) двух матриц, первая из которых симметрична относительно главной (побочной) диагонали.
38– 41. Найти сумму (произведение) двух матриц, симметричных относительно главной (побочной) диагонали.
С О Д Е Р Ж А Н И Е
1. Рабочая программа курса “Методы программирования” ……….. 3
-
Разветвляющиеся алгоритмы. Ввод, вывод ……………………... 6
-
Циклические алгоритмы ………………………………………….. 8
-
Одномерные массивы (векторы) …………………………………. 12
-
Функции с одним результатом ………………………………….…16
-
Функции типа void ………………………………………………... 21
-
Введение в объектно-ориентированное программирование …… 27
-
Простые типы данных …………………………………………….. 36
-
Матрицы (двухмерные массивы) ………………………………… 41
Учебное издание
Аленский Николай Алексеевич