2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Квадратная матрица [ С++]
Сообщение11.04.2016, 18:40 


26/03/16
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 
Заслуженный участник


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

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

 Профиль  
                  
 
 Re: Квадратная матрица
Сообщение13.04.2016, 07:00 


08/05/08
601
А мне вот интересно: вот это вот
Цитата:
#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 
Заслуженный участник


20/08/14
11867
Россия, Москва
ET
Не приведёт. Препроцессор сначала удаляет комментарии, а уж потом разбирает строку, потому #define к моменту анализа будет чистым.

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

 Профиль  
                  
 
 Re: Квадратная матрица
Сообщение13.04.2016, 07:25 


08/05/08
601
Понял, не знал
Я даже думал, что
#define REM //
создаст новый вид комментария
Dmitriy40 писал(а):
А вот не будет ли заменена и маленькая n на значение большой N я не уверен и так делать не стал бы.

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

 Профиль  
                  
 
 Re: Квадратная матрица
Сообщение13.04.2016, 09:29 
Заслуженный участник


20/08/14
11867
Россия, Москва

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

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

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

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


08/05/08
601

(Оффтоп)

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

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

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

 Профиль  
                  
 
 Re: Квадратная матрица
Сообщение13.04.2016, 11:16 
Заслуженный участник


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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group