Хочу получить удостоверение. Сколько стоит оплата? |
Перегрузка функций
Перегрузка функций используется для того, чтобы функции с одним и тем же именем выполнялись по-разному в зависимости от типа и количества фактических параметров.
Для обеспечения перегрузки функций необходимо для каждого имени определить, сколько разных функций связано с ним, т.е. сколько вариантов сигнатур допустимы при обращении к ним. В приводимом ниже примере рассматриваются операции с матрицами, причем в зависимости от фактических параметров производится сложение, умножение, транспонирование и обращение матриц, а также создание единичной диагональной матрицы. При написании функций, отвечающих за транспонирование и сортировку, использовался алгоритм, описанный в книге (В.В. Подбельской. Язык С++. М.: Финансы и статистика. 1995). Помимо функции matrix(), производящей расчеты перегружена, также функция печати print(), выводящая на экран как вещественные, так и целочисленные массивы.
//========================================================== // Name : overload_multiplication.cpp // Author : Marat // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //========================================================== #include <iostream> using namespace std; #define n 4 //Порядок матриц long i,j,k; double Delta[n][n]; double Sigma[n][n]; int main() { //Умножение целочисленных матриц void matrix(int a[n][n], int b[n][n]); //Умножение вещественных матриц void matrix(double a[n][n], double b[n][n]); //Печать вещественнного двумерного массива void print (double c[n][n]); //Печать целочисленного двумерного массива void print (int c[n][n]); double ARRAY_X[n][n]={ {1.1, 1.2, 1.3, 1.4}, {1.5, 1.6, 1.7, 1.8}, {1.9, 2.0, 2.1, 2.2}, {2.3, 2.4, 2.5, 2.6} }; double ARRAY_Y[n][n]={ {3.1, 3.2, 3.3, 3.4}, {3.5, 3.6, 3.7, 3.8}, {3.9, 4.0, 4.1, 4.2}, {4.3, 4.4, 4.5, 4.6} }; int ARRAY_Z[n][n]={ {1, 3, 5, 7}, {2, 4, 6, 8}, {9, 11, 13, 15}, {10, 12, 14, 16} }; int ARRAY_W[n][n]={ {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16} }; cout<<"\nFirst double matrix"; print(ARRAY_X); cout<<"\nSecond double matrix"; print(ARRAY_Y); cout<<"\nMultiplying"; matrix(ARRAY_X,ARRAY_Y); print(Sigma); cout<<"\nFirst integer matrix"; print(ARRAY_Z); cout<<"\nSecond integer matrix"; print(ARRAY_W); matrix(ARRAY_Z,ARRAY_W); cout<<"\nMultiplying matrix"; print(Delta); return 0; } //////////////////////////////////// //Умножение целочисленных матриц ///////////////////////////////////// void matrix(int a[n][n], int b[n][n]) { for(i=0;i<n;i++) { for(j=0;j<n;j++) { for(k=0;k<n;k++) { Delta[i][j]+=a[i][k]*b[k][j]; } } } } ///////////////////////////////////// //Умножение вещественных матриц ///////////////////////////////////// void matrix(double a[n][n], double b[n][n]) { for(i=0;i<n;i++) { for(j=0;j<n;j++) { for(k=0;k<n;k++) { Sigma[i][j]+=a[i][k]*b[k][j]; } } } } ////////////////////////////////////// //Печать целочисленного массива ///////////////////////////////////// void print(int c[n][n]) { for(i=0;i<n;i++) { cout<<"\n"; for(j=0;j<n;j++) { cout<<"\t"<<c[i][j]; } } cout<<"\n"<<endl; } ////////////////////////////////////// //Печать вещественного массива ////////////////////////////////////// void print(double c[n][n]) { for(i=0;i<n;i++) { cout<<"\n"; for(j=0;j<n;j++) { cout<<"\t"<<c[i][j]; } } cout<<"\n"<<endl; }
Результат:
18.7 | 19.2 | 19.7 | 20.2 |
24.62 | 25.28 | 25.94 | 26.6 |
30.54 | 31.36 | 32.18 | 33 |
36.46 | 37.44 | 38.42 | 39.4 |
В следующем примере рассматриваются две перегружаемые функции: сложения целочисленных матриц и создание единичной диагональной матрицы произвольного порядка (Подбельский). Функции с одинаковыми именами работают по разным алгоритмам.
//========================================================== // Name : overload_matrix.cpp // Author : Marat // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //========================================================== #include <iostream> using namespace std; #include<stdlib.h> #define n 4 //Порядок матриц int i,j; //////////////////// int delta[n][n]; // //////////////////// int main() { //Сложение двух вещественных матриц void matrix(int ARRAY_X[n][n], int ARRAY_Y[n][n]); //Создание единичной диагональной //матрицы изменяемого порядка void matrix(int m); //Печать целочисленного двумерного массива void print (int c[n][n]); //Матрицы a и b умножаются int a[n][n]={ {1, 3, 5, 7}, {2, 4, 6, 8}, {9, 11, 13, 15}, {10, 12, 14, 16} }; int b[n][n]={ {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16} }; cout<<"\nFirst matrix"; print(a); cout<<"\nSecond matrix"; print(b); cout<<"\nAdding of two integer matrix"; matrix(a,b); print(delta); cout<<"\nCreation of a single diagonal matrix of any order"; matrix(n); return 0; } /////////////////////////////////////////////////////// //Сложение матриц /////////////////////////////////////////////////////// void matrix(int ARRAY_X[n][n], int ARRAY_Y[n][n]) { int s_x, s_y; int *param_x[n]; // Вспомогательный массив указателей на первую матрицу int *param_y[n]; // Вспомогательный массив указателей на вторую матрицу for (i=0; i<n; i++) // Цикл перебора строк { param_x[i] = (int *)&ARRAY_X[i]; } for (i=0; i<n; i++) // Цикл перебора строк { param_y[i] = (int *)&ARRAY_Y[i]; } for(i=0;i<n;i++) { for(j=0;j<n;j++) { s_x=param_x[i][j]; s_y=param_y[i][j]; delta[i][j]=s_x+s_y; } } } /////////////////////////////////////////////// //Создание единичной диагональной //матрицы произвольного порядка ////////////////////////////////////////////// void matrix(int m) { int **matr; // Указатель для массива указателей matr = new int *[n];// Массив указателей double * if (matr == NULL) { cout <<"The dinamic array doesn't created!"; return; // Завершение программы } for (int i=0;i<n;i++) {// Строка-массив значений типа double: matr[i]=new int[n]; if (matr[i] == NULL) {cout << "The dinamic array doesn't created!"; return;// Завершение программы } for (int j = 0; j < n; j++) // Заполнение матрицы // Формирование нулевых элементов: if (i !=j) matr[i][j] = 0; else // Формирование единичной диагонали: matr[i][j] = 1; } for (i=0;i<n;i++) // Цикл перебора строк { cout<<"\n";// Цикл печати элементов строки: for (j=0;j<n;j++) cout << "\t" << matr[i][j]; } for (i = 0; i < n; i++) delete matr[i];//Уничтожение матрицы delete[]matr; cout<<"\n"<<endl; } //////////////////////////////////////////////////////////// ////////////////////////////////////// //Печать целочисленного массива ///////////////////////////////////// void print(int c[n][n]) { for(i=0;i<n;i++) { cout<<"\n"; for(j=0;j<n;j++) { cout<<"\t"<<c[i][j]; } } }
Результат: