Int i,j;
for (i=0;i<n;i++)
for (j=i;j<n;j++)
{
X[i][j]=(Y[i][j] + Y[j][i])/2;
X[j][i] =X[i][j];
}
}
void VIVOD(float Y[4][4], int n)//функция вывода матрицы
{for (i=0;i<n;i++)
{for (j=0;j<n;j++) printf("%8.2f",Y[i][j]);
printf("\n");
}
}
void main()
{
float A[4][4], B[4][4], C[4][4], D[4][4];
int i, j;
printf("Введите матрицу А\n");
for (i=0;i<3;i++)
for (j=0;j<3;j++) scanf("%f",&A[i][j]);
printf("Введите матрицу B\n");
for (i=0;i<4;i++)
for (j=0;j<4;j++) scanf("%f",&B[i][j]);
SM(A, 3,C);// обращение к функции SM для матрицы A
SM(B, 4, D); //обращение к функции SM для матрицы B
printf("Симметричная матрица С\n");
VIVOD(C,3);
printf("Симметричная матрица D\n");
VIVOD(D,4);
}
Перегрузка функций в С++
Перегруженная функция – это функция, которая позволяет при обращении к себе варьировать типы передаваемых параметров. Цель перегрузки состоит в том, чтобы функция с одним и тем же именем возвращала разного типа значение при обращении к ней с различными типами фактических параметров. Рассмотрим этот механизм на примере некоторой абстрактной функции с именем SUM. Допустим, мы имеем три варианта функции SUM.
float SUM (float a, float b);
//принимает два вещественных аргумента и возвращает результат ввиде вещественного числа
double SUM (double a, double b);
//принимает два аргумента вещественного длинного типа и возвращает результат ввиде вещественного длинного числа
complex SUM (complex a, complex b);
//принимает два аргумента комплексного типа и возвращает результат ввиде комплексного числа
Компилятор определит, какую именно функцию с именем SUM надо вызвать по типу передаваемых ей параметров.
Наполним функцию SUM банальным алгоритмом вычисления суммы двух чисел.
#include "stdafx.h"
#define complex struct compl
complex
{double x,y;};
complex SUM (complex a, complex b)
{complex c;
c.x=a.x+b.x;
c.y=a.y+b.y;
return c;
}
float SUM (float a, float b)
{float c;
c=a+b;
return c;
}
double SUM (double a, double b)
{ double c;
c=a+b;
return c;
}
int _tmain(int argc, _TCHAR* argv[])
{complex z,m,n;
float a=4.5,b=6.5;
z.x=5; z.y=6;
m.x=7;m.y=8;
n= SUM (z,m); //вызов функции SUM для комплексных параметров
printf("%lf+i%lf\n",n.x,n.y);
float d= SUM (a,b); //вызов функции SUM для вещественных параметров
printf("d=%f\n",d);
float d2= SUM (10,35); //неоднозначный вызов функции SUM
printf("d2=%f\n",d2);
return 0;
}
Использование нескольких функций с одним и тем же именем, но с различными типами параметров, называется перегрузкой функций.
По типам фактических параметров компилятор определяет, какую именно функцию требуется вызвать. Этот процесс называется разрешением перегрузки (перевод английского слова resolution в смысле «уточнение»). Тип возвращаемого функцией значения в разрешении не участвует. Механизм разрешения основан на достаточно сложном наборе правил, смысл которых сводится к тому, чтобы использовать функцию с наиболее подходящими аргументами или выдать сообщение, если такой не найдется. Если точного соответствия не найдено, выполняется преобразование типов параметров по общим правилам, например char в int; int во float, float в double; и т.п. Если соответствие может быть получено более чем одним способом, вызов считается неоднозначным и выдается сообщение об ошибке. В нашем примере это продемонстрировано вызовом третьим, когда в функцию SUM передаются в качестве параметров два целых числа 10 и 35. Эти параметры могут быть преобразованы как в тип float, так и в тип double, что и вызовет возникновение ошибочной неоднозначности.
При создании перегруженных функций необходимо придерживаться следующих правила:
• Перегруженные функции должны находиться в одной области видимости,
иначе произойдет сокрытие аналогично тому, как это происходит с одинаковыми именами переменных во вложенных блоках.
• Перегруженные функции могут иметь параметры по умолчанию, при этом
значения одного и того же параметра в разных функциях должны совпадать.
В различных вариантах перегруженных функций может быть различное количество параметров по умолчанию.
• Функции не могут быть перегружены, если описание их параметров отличается только модификатором const (например, int и const int ), или использованием ссылки (например, int и int&).
Более подробную информацию о перегруженных функциях см. в [2].
Дата добавления: 2015-02-10; просмотров: 847;