- •Часть 2
- •18 Сентября 2012 г., протокол № 1
- •Предисловие
- •Глава 6 простые типы данных § 1. Целый тип
- •1.1. Битовые операции
- •Использование битовых операций
- •1.3. Упаковка и распаковка информации
- •§ 2. Логический тип
- •§ 3. Символьный тип
- •§ 4. Вещественный тип
- •§ 5. Преобразование типов
- •Преобразование типов в выражениях
- •Преобразование типов при присваивании
- •Г л а в а 7 введение в указатели
- •§ 1. Понятие указателя. Операции разыменования и разадресации
- •§ 2. Инициализация и присваивание указателей
- •§ 3. Распределение динамической памяти
- •Операция new
- •Операция delete
- •§ 4. Параметры-указатели. Функция ввода scanf
- •Упражнения, тесты
- •Г л а в а 8 одномерные массивы, указатели и функции
- •§ 1. Связь указателей и одномерных массивов. Передача массива в качестве параметра функции
- •§ 2. Сортировка одномерных массивов
- •§ 3. Сортировка массива по параметру числа
- •§ 4. Сортировка массива выбором.
- •§ 5. Сортировка массива вставками
- •§ 6. Динамические одномерные массивы
- •6.1. Порядок работы с динамическим массивом
- •6.2. Работа с динамическим массивом в классе. Деструктор
- •§ 7. Введение в строки
- •Глава 9 мАтрицы
- •§ 1. Объявление, способы определения матриц
- •§ 2. Вывод матриц
- •§ 3. Типы алгоритмов
- •3.1. Построчная обработка
- •Обработка матрицы по столбцам
- •3.3. Обработка всей матрицы
- •3.4. Обработка части матрицы
- •Преобразование матрицы
- •Построение матриц
- •§ 4. Матрицы, указатели и функции
- •Упражнения и тесты
- •Обработка матрицы по столбцам.
- •Список реКоМендуемой литературы
- •Сборники задач по программированию
- •Оглавление
- •Методы программирования:
- •Лекции, примеры, тесты
- •Пособие для студентов механико-математического факультета
- •В двух частях
- •Часть 2
Упражнения и тесты
1. Есть ли ошибки? Если есть, указать, в каких строках. Если нет, записать, что будет выведено.
const size2=6;
void Sort1(int X[],int m)
{ int min,Nmin;
for(int k=0;k<m-1;k++) { min=X[k]; Nmin=k;
for (int j=k;j<m;j++)
if(X[j]<min) {min=X[j]; Nmin=j; }
X[Nmin]=X[k]; X[k]=min; }
}
void Sortmatr2(int M[][size2],int n,int m)
{ for(int i=0;i<n;i+=2) Sort1( &M[i][0] ,m*2); }
void MyOut(int M[][size2],int n,int m)
{ for(int i=0;i<n;i++) { cout<<endl;
for(int j=0;j<m;j++)
printf("%4d ",M[i][j]);
} cout<<endl;
}
int main() { const n=4,m=6;
int A[n][size2]={{4, 3, -2}, {1, 11, -12, 13, 14},
{20, -21, 22, -23}, {30, 4, 3, 2,1} } ;
Sortmatr2(A,n,m); MyOut (A,n,m);
getch(); return 0;
}
2. Есть ли ошибки? Если есть, указать, в каких строках. Если нет, записать, что будет выведено.
const size2=6;
int Sum1(int *X, int m)
{ int S=0; for(int j=0; j<m; j++) S+=X[j];
return S; }
void SumM1 (int M[][size2],int n,int m, int *S1)
{ for(int i=0;i<n;i++) S1[i]=Sum1 ( &M[i][m/2] ,m/2); }
void SumM2 (int M[][size2],int n,int m, int *S2)
{ for(int i=0;i<n;i++) S2[i]= Sum1(&M[i][1] ,m-1); }
void MyOut(int *s, int n)
{ cout<<endl; for(int i=0;i<n;i++) cout<< s[i]<<" "; }
int main()
{ const n=4,m=6; int A[n][size2]={{4, 3, -2}, {1, 11, -12, 13, 14},
{20, -21, 22, -23}, {30, 4, 3, 2,1} },
S1[n] , S2[n];
SumM1 (A,n,m,S1); MyOut (S1,n);
SumM2 (A,n,m,S2); MyOut (S2,n);
getch(); return 0; }
3. Пусть описана функция:
int MyMax (int *x, int n)
{ int Max=x[0];
for int i=0; i<n; i++) if (x[i]>Max) Max=x[i];
return Max; }
3.a. Как её использовать для вывода наибольшего элемента каждой строки матрицы: const n=4, m=6; int A[n][m];? Выбери правильные варианты ответов:
1) cout<<MyMax (A[0], n*m);
2) for (int i=0; i<n; i++) cout<< MyMax (A[i], m)<< “ “;
3) for (int i=0; i<n; i++) printf(“%5d”, MyMax (A[i], m);
4) int Res=MyMax(&A[0][0], n*m); cout<<Res;
5) for (int j=0; j<m; j++) cout<< MyMax (A[j], n)<< “ “;
3.b. Как использовать ту же функцию MyMax для вывода наибольшего элемента всей матрицы const n=4,m=6; int A[n][m];?
Выбери правильные варианты ответов:
1) MyMax (A[0], n*m);
2) cout<< MyMax (&A[0], n*m);
3) cout<< MyMax (A[0][0], n*m);
4) int R=MyMax(&A[0][0], n*m); cout<<R;
5) int R=MyMax(&A[0][0], n); cout<<R;
6) int R; R=MyMax(A[0], m); cout<<R;
7) int R; R=MyMax(A[0], m*n); cout<<R;
8) cout<< MyMax(&A[0][0], n*m);
4. Пусть описана следующая функция:
void MyMax (int *x, int n, int &Max)
{ Max=x[0]; for (int j=1; j<n; j++)
if (x[j]>Max) Max=x[j]; }
Как её использовать для вывода наибольшего элемента всей матрицы
const n=4, m=6; int A[n][m];?
Выбери правильные варианты ответов:
1) int R=MyMax(&A[0][0], n*m); cout<<R;
2) int R; MyMax(&A[0], m*n, R); cout<<R;
3) int R; MyMax(A[0], n*m, R); cout<<R;
4) int R; cout<< MyMax(&A[0][0], n*m, R);
5) int R; MyMax(&A[0][0], m*n, R); cout<<R;
Задачи
1. Составить следующие функции для работы с матрицей: ввод матрицы; вывод; транспонирование матрицы с сохранением результата на новом месте; умножение исходной матрицы на транспонированную; головную функцию для проверки этих функций:
const int n2=3; void INP1(double x[][n2] , int );
void OUT1(double x[][n2], 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 size=3; int k;
double a[size][n2], b[size][n2], c[size][n2];
INP1(a,size); cout<<"\nOld matrix\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 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. Составить класс для работы с целочисленной матрицей, включив в него матрицу, конкретные текущие размерности, конструктор для ввода и проверки текущих размерностей и следующие методы: ввод матрицы; вывод матрицы; поиск наибольшего и наименьшего значений матрицы и номеров строк, где они находятся; перестановку двух строк матрицы. В функции main ввести размерности матрицы, создать объект и проверить составленные методы:
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);
}; // End of class
void ClMatr::MyInp()
{ int x, y=3;
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)
{ if (k1!=k2)
for (int j=0; j<n2; j++) { int d=a[k1][j]; a[k1][j]=a[k2][j];
a[k2][j]=d; }
}
int main() { int n1, n2, Nmax, Nmin, max, min;
cout<<"\nn1="; cin>>n1; cout<<" n2="; cin>>n2;
ClMatr ob(n1,n2); 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— 9 уровня B и 1, 2, 5 уровня С разработать функцию для работы с одномерным массивом и использовать её для каждой строки матрицы.
Разработать несколько функций для работы со всей матрицей.
Разработать два варианта проекта: 1) разбить весь проект на самостоятельные функции; 2) функции включить в класс и с помощью конструктора создать и использовать объект.
Уровень B
Обработка строк матрицы.
В каждой строке матрицы найти указанные величины и из них построить один или два одномерных массива, размерности которых соответствуют количеству строк матрицы:
среднее значение среди положительных чисел и среднее значение среди отрицательных элементов;
второй наибольший элемент и его номер в строке. Если вторых наибольших элементов в строке несколько, найти номер первого из них;
сумму чисел до первого положительного числа, включая его;
есть ли нуль в строке? Для каждой строки получить 1, если есть, и 0 в противном случае;
первый отрицательный элемент и его номер. Если отрицательных чисел в строке нет, получить соответственно 0 и -1.
В матрице найти сумму наибольших элементов строк, наибольшую сумму элементов строк и номер такой строки (любой, если несколько строк имеют наибольшую сумму).
Найти наибольший среди наименьших элементов строк и наименьший среди наибольших элементов строк.
В матрице найти количество строк, у которых: 1) все нули; 2) есть хотя бы один нуль и номер первой такой строки.
Дана матрица A, в которой Ai,j — оценка i–го студента на j–м экзамене. Фамилии и названия предметов в памяти не хранятся:
найти количество отличников, т. е. количество строк, в которых только 9 и (или) 10. При выводе такие строки выделить другим цветом;
найти количество двоечников, т. е. количество строк, в которых есть хотя бы одна 1 и (или) 2 и (или) 3.
Умножить матрицу на вектор (одномерный массив).
7. Переставить строки, в которых находится наибольший и наименьший элементы матрицы.
Указание. На первом этапе необходимо найти номера строк (n1 и n2), в которых находятся наибольший и наименьший элементы всей матрицы. И если n1 != n2, то переставляем эти строки так, как показано в 3.5.
8. Из матрицы удалить все строки, состоящие из одних нулей.
Указание. В цикле проверяем каждую строку и если она содержит только нули, то удаляем её так, как показано в 3.5.
9. Каждую строку матрицы рассортировать по возрастанию.
