Чтобы знать, как передать требуемые аргументы в функцию, вам нужно знать, что такое прототип функции.
Прототип функции - это что-то вроде этого «возвращаемого типа», «имени функции», «аргументов функции».
Функция принимает аргументы и может возвращать значение (если требуется).
Например:
int sum_two_ints(int num1, int num2)
- это прототип функции, которая принимает 2 целых числа (num1)и num2).
, а также возвращает целое число, которое является суммой num1
и num2
(отсюда и «int» перед именем функции). Чтобы написать функцию, вам нужно знать, какова функция вашей функции и какие данные нужны для ее работы. В вашем случае вам нужна функция, которая возьмет две матрицы и создаст матрицу, которая является суммой двух матриц, которые вы дали.
Теперь, что нужно вашей функции "сумма"? Для этого нужны две матрицы (m1 и m2), которые имеют тип «int *». Также необходимы размеры этих двух матриц (добавление двух матриц-заполнителей, чтобы они имели одинаковые размеры). Что возвращает ваша функция? Он вернет новую матрицу, которая будет суммой двух предоставленных вами матриц.
С учетом этой информации ваша функция будет иметь следующий прототип: int *sum(int *m1, int *m2, int w, int k)
Следующим шагом будет написание тела функции(как он будет выполнять свою работу) в псевдокоде
create a new matrix of the dimensions w * k. (let's call it res)
iterate through all rows and columns of the res matrix and assign its value to be the following:
res[row][col] = m1[row][col] + m2[row][col].
return the resulting matrix as the function's return value.
Последний шаг, как вызвать сумму функций из основной функции, это самая простая часть. Он принимает два аргумента типа "int *", это ваши m1 и m2. Он также принимает ширину и высоту этих матриц (w1 и k1 или w2 и k2). В результате он возвращает другую переменную "int *", поэтому вам нужно ее где-то хранить. Я добавил код, который реализует эту информацию с некоторыми комментариями. Пожалуйста, прочитайте больше о том, как работают указатели и функции. Последнее замечание: любой вызов malloc должен отвечать вызовом free в нужном месте, в противном случае ваша программа утечет память.
Cheers
int *sum(int *m1, int *m2, int w, int k)
{
int *res;
// resulting matrix will have the same dimensions as m1 and m2.
res = malloc(w * k * sizeof(int));
for (int i = 0 ; i < w; i++)
{
// Iterate throught the elements of res,
// the same way you iterated through m1 and m2 to assign their values.
// Only res[i][j] = m1[i][j] + m2[i][j].
for(int j = 0 ; j < k ; j++)
{
res[i * w + j] = m1[i * w + j] + m2[i * w + j];
}
}
return (res);
}
int main()
{
int w1, k1;
int* m1;
int w2, k2;
int* m2;
printf("type the number of lines and columns for matrix1: ");
scanf("%d %d", &w1, &k1);
m1 = (int*)malloc(w1 * k1 * sizeof(int));
printf("type the number of lines and columns for matrix1: ");
scanf("%d %d", &w2, &k2);
m2 = (int*)malloc(w2 * k2 * sizeof(int));
// You might want to check that the given arrays have the same dimensions before
// continuing, as adding 2 matrices requiere both matrices to have the same dimensions.
if (w1 != w2 || k1 != k2)
{
printf("Error, the two matrices don't have the same dimensions\n");
free(m1);
free(m2);
return (0);
}
int i, j;
for (i = 0; i < w1; i++)
{
for (j = 0; j < k1; j++)
{
printf("type the values for cell ( %d,%d ): ", i,j);
scanf("%d", &m1[i*w1 + j]);
}
}
int m, n;
for (m = 0; m < w2; m++)
{
for (n = 0; n < k2; n++)
{
printf("type the values for cell ( %d,%d ): ", m, n);
scanf("%d", &m2[m * w2 + n]);
}
}
// This will hold the matrix returned as a result of the function sum
int *res;
res = sum(m1, m2, w1, k1);
for (i = 0; i < w1; i++)
{
for (j = 0; j < k1; j++)
{
printf("%d ", res[i * w1 + j]);
}
printf("\n");
}
// don't forget to free the space you allocated when you are done with it.
free(m1);
free(m2);
free(res);
return (0);
}