Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Аленский. лекции по проге.doc
Скачиваний:
19
Добавлен:
11.11.2018
Размер:
1.35 Mб
Скачать

Задачи и упражнения.

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 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);

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);

};

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. В зависимости от способностей студентов задания выполняются в модульном и (или) объектно–ориентированном стиле, что влияет на оценку. Каждый проект необходимо разделить на несколько функций (методов).

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

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

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

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

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

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

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

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

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

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

  1. все нули;

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

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

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

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

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