C/C++

Задача по программированию C++

Помогите исправить программу
Дана двухмерная матрица А размером n × m. Рассчитать Евклидову норму матрицы ||A||ₑ , используя функции рассчета этой нормы

#include <iostream>
#include <clocale>
#include <math.h>
using namespace std;

int** Create( size_t n, size_t m ) {
int** M = new int* [n];
for ( size_t i = 0; i < n; ++i ) {
M[i] = new int [m];
return M;
}
}

void Input( int M, size_t n, size_t m ) {
for ( size_t i = 0; i < n; ++i ) {
for ( size_t j = 0; j < m; ++j ) {
cin>>M[i][j];

}

}

}

double Process ( int M, size_t n, size_t m)
{
int S=0, i=0;
for (size_t i = 0; i < n; ++i );
{
for ( size_t j = 0; j < m; ++j )
{
S += M[i][j]*M[i][j];
}
}
cout << sqrt(S);
return sqrt(S);
}


int main ()
{
double n=0, m=0;
cout << "Vvedite n";
cin >> n;
cout << "Vvedite m";
cin >> m;
}





Компилятор выдаёт следующие ошибки
main.cpp:25:21: error: invalid types ‘int[size_t {aka long unsigned int}]’ for array subscript
25 | cin>>M[i][j];
| ^
main.cpp: In function ‘double Process(int, size_t, size_t)’:
main.cpp:40:15: error: invalid types ‘int[int]’ for array subscript
40 | S += M[i][j]*M[i][j];
| ^
main.cpp:40:23: error: invalid types ‘int[int]’ for array subscript
40 | S += M[i][j]*M[i][j];
| ^
main.cpp: In function ‘int** Create(size_t, size_t)’:
main.cpp:20:1: warning: control reaches end of non-void function [-Wreturn-type]
20 | }
| ^
#include < cmath > //=)

for ( size_t i = 0; i < n; ++i ) {
M[i] = new int [m];
return M;
Ошибка. Как только у Вас создалась первая строка - Вы тут-же возвращаете матрицу
return надо вынести после циклов.

void Input( int M, size_t n, size_t m ) { - конечно Вы передаете не матрицу (указатель), а целое
void Input( int** M, size_t n, size_t m ) {

В Process аналогично

В идеале добавить удаление (delete) матрицы из памяти.

double n=0, m=0; - если это будущие размеры матрицы - стоило их сделать целочисленными ;)

В main наверное стоило вызвать Create, Input и Process, но я так понимаю это черновик.

ЗЫЖ Для сумм лучше, конечно использовать целое хотя-бы на размер больше. Тем более когда идёт сумма квадратов. Ну это так...
clocale при транслите не нужна ;)
int S=0, i=0; - i = 0 лишнее
Бурмистров Алексей
Бурмистров Алексей
84 764
Лучший ответ
Разяп Шайхлиев Спасибо, ошибки исчезли. Но Евклидова норма матрицы не выводится. Можете подсказать в чём проблема?
Я когда что-то подобное делаю, то просто всё всегда стараюсь тщательно продумывать, а поэтому у меня мало бывает что лишнего и всё всегда, естественно, работает как надо. Вот пример программы с рандомно задаваемой матрицей. Где тут лишние переменные, где лишние аргументы функции? Честно говоря, если б у меня не было в основной программе обертки в бесконечный цикл, то я бы и delete не стал писать - нужен он мне больно!
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <ctime>
using namespace std; int k, l, m, n;
double norma(double **a)
{ double s = 0.; for (k = 0; k < n; k++)
for (l = 0; l < m; l++) s += pow(a[k][l], 2);
cout << s << endl; return sqrt(s); }
int main()
{ cout.precision(16); for (;;)
{ cout << "n m: "; cin >> n >> m;
double **A = new double *[n];
for (k = 0; k < n; k++) A[k] = new double [m];
srand(time(NULL)); for (k = 0; k < n; k++)
for (l = 0; l < m; l++) A[k][l] = rand() % 201 - 100;
cout << norma(A) << endl; for (l = 0; l < n; l++)
delete [] A[l]; } }
Олег Тетерин
Олег Тетерин
28 648
for ( size_t i = 0; i < n; ++i ) { сделай for ( size_t i = 0; i < n; +i ) {
S += M[i][j]*M[i][j]; сделай S = M[i][j]*M[i][j];
double n=0, m=0;
cout << "Vvedite n";
cin >> n;
сделай
double n=1, m=1;
cin << "Vvedite n";
cout >> n;
Разяп Шайхлиев Не помогло
main.cpp:25:21: error: invalid types ‘int[size_t {aka long unsigned int}]’ for array subscript
25 | cin>>M[i][j];
| ^
main.cpp: In function ‘double Process(int, size_t, size_t)’:
main.cpp:40:14: error: invalid types ‘int[int]’ for array subscript
40 | S = M[i][j]*M[i][j];
| ^