2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Квадратная матрица [ С++]
Сообщение11.04.2016, 18:40 
В квадратной матрице вычислить сумму элементов, расположенных на одной горизонтали - М и вертикали - К с заданным элементом матрицы А[М,К], и полученное значение присвоить всем элементам матрицы, не участвовавшим в суммировании.
Так я ее реализовал на языке С++
Мне кажется, что ввод массива я сделал неграмотно. Может быть можно как по-другому вводить массив без тех ограничений?
Код:
//#include "stdafx.h"
#include <conio.h>
#include <iostream>
#include <iomanip>
#define N 100 //
using namespace std;
int main()
{
   int A[N][N],n,m,k,sum=0;
   setlocale (0, "");
   cout << "Размер матрицы; N: ";
   cin >> n;
   if (n>N||n==0)
    {
    cout << "недопустимый размер матрицы;";
    return 0;
    }
   cout << "введите матрицу;" << endl;
   for(int i=0;i<n;i++)
   {
      for(int j=0;j<n;j++)
      {
         cout << "A[" << i << "][" << j << "] = ";
         cin >> A[i][j];
      }
   }
   cout << "исходная матрица;" << endl;
   for(int i=0;i<n;i++)
   {
      for(int j=0;j<n;j++)
      {
      cout<<setw(5);
      cout << A[i][j];
      }
      cout<<endl;
   }
   do
   {
      cout << "введите заданный элемент; M(1.."<< n <<" ): ";
      cin >> m;
   }
   while(!(m>=1&&m<=n));
   {
   do
   {   
      cout << "введите заданный элемент; K(1.."<< n <<" ): ";
      cin >> k;
    }
    while(!(k>=1&&k<=n));
    }
    cout <<"координата строки; M = " << m << endl;
    cout <<"координата столбца; K = " << k << endl;
    m--;k--;
   for(int i=0;i<n;i++)
   {
      sum=sum+A[m][i];
      sum=sum+A[i][k];
   }
   sum=sum-A[m][k];
   cout << "Сумма; = " << sum << endl;
   for(int i=0;i<n;i++)
   {
      for(int j=0;j<n;j++)
      {
         if(i!=m&&j!=k)
         A[i][j]=sum;
      }
   }
   cout << "новая матрица" << endl;
   for(int i=0;i<n;i++)
   {
      for(int j=0;j<n;j++)
      {
      cout<<setw(5);
      cout << A[i][j];
      }
      cout << endl;
   }
system("pause");
   return 0;
}

 
 
 
 Re: Квадратная матрица
Сообщение11.04.2016, 19:10 
Жуть... Ну ладно, использование MSVS накладывает свой неизгладимый отпечаток на все, но это мелочи. Почему бы Вам не воспользоваться динамическим выделением памяти? Сначала узнаете размер матрицы, а потом делаете new() (или calloc(), или malloc()). Или, что еще проще, сразу пишете на современном C (без всяких ++), тогда объявить матрицу можно будет после выяснения ее размера.

Ну и, кстати, ввод матрицы вручную с клавиатуры в задании явно оговаривался? Если нет - читайте из файла, оно существенно удобнее.

 
 
 
 Re: Квадратная матрица
Сообщение13.04.2016, 07:00 
А мне вот интересно: вот это вот
Цитата:
#define N 100 //

и, например, вот это вот
Цитата:
int A[N][N],n,m,k,sum=0;


Не приведет ли к тому, что 2я строчка будет заменена препроцессором на

Цитата:
int A[100 //][100 //],n,m,k,sum=0;

с ошибкой компилятора?
Дефайнами надо аккуратно пользоваться...

 
 
 
 Re: Квадратная матрица
Сообщение13.04.2016, 07:15 
ET
Не приведёт. Препроцессор сначала удаляет комментарии, а уж потом разбирает строку, потому #define к моменту анализа будет чистым.

diman19rus в сообщении #1114185 писал(а):
Код:
int A[N][N],n,m,k,sum=0;
А вот не будет ли заменена и маленькая n на значение большой N я не уверен и так делать не стал бы.

 
 
 
 Re: Квадратная матрица
Сообщение13.04.2016, 07:25 
Понял, не знал
Я даже думал, что
#define REM //
создаст новый вид комментария
Dmitriy40 писал(а):
А вот не будет ли заменена и маленькая n на значение большой N я не уверен и так делать не стал бы.

А вот тут я уверен - не будет. На сях я в свое время немало писал. И дефайны нетривиальные писал. У дейфайнов есть много подводных камней, поэтому комментарии в них не писал никогда.

 
 
 
 Re: Квадратная матрица
Сообщение13.04.2016, 09:29 

(Препроцессор)

ET в сообщении #1114600 писал(а):
Понял, не знал
Я даже думал, что
#define REM //
создаст новый вид комментария
Нет, она создаст новый терм (слово) с пустым значением. Проверить его наличие можно будет в #ifdef REM, #ifndef REM.

ET в сообщении #1114600 писал(а):
Dmitriy40 писал(а):
А вот не будет ли заменена и маленькая n на значение большой N я не уверен и так делать не стал бы.
А вот тут я уверен - не будет.
Всё равно я бы так делать не стал. Это провоцирует опечатки, ради ухода от которых и затевалась вся система синтаксического контроля, а тут вы (ну не вы конечно) практически отбираете у компилятора мощный инструмент контроля опечаток человека, нехорошо это. Ну и плюс я не уверен во всех ли языках переменные и функции различают регистр букв, потому не стоит привыкать к отличию n от N, пусть даже и во всех (а всех ли?) диалектах С/С++ это так и есть. Да ещё вдруг какие-то компиляторы позволяют опциями или из командной строки отключить различие больших/маленьких букв? И программа перестанет компилиться или корректно работать (что значительно хуже, такие глюки можно искать годами).
Так что не стоит так делать, не стоит. Даже если компилятор и позволяет. ИМХО.

 
 
 
 Re: Квадратная матрица
Сообщение13.04.2016, 09:47 

(Оффтоп)

Dmitriy40 в сообщении #1114612 писал(а):
Всё равно я бы так делать не стал. Это провоцирует опечатки, ради ухода от которых и затевалась вся система синтаксического контроля,

Да практически во всех книжках моего времени по си подчеркивалось, что си различает регистр букв в идентификаторах и в дефайнах.
Я тоже подавляющую часть времени проработал с языками, которые регистр не различают и матерюсь сейчас, когда иногда на других языках пишу, ибо трудно точно соблюдать регистр букв в каких-нибудь длинных чужих идентификаторах
Dmitriy40 в сообщении #1114612 писал(а):
Ну и плюс я не уверен во всех ли языках переменные и функции различают регистр букв

Во всех потомках си : C++, java
в других, как праивло, не различают

 
 
 
 Re: Квадратная матрица
Сообщение13.04.2016, 11:16 
ET в сообщении #1114597 писал(а):
Не приведет ли к тому, что 2я строчка будет заменена препроцессором на
Не приведет, но что мешало ТС писать действительно на C++ и сделать это в виде const int N=100;, совершенно неясно.

 
 
 [ Сообщений: 8 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group