Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Соседи элементов матрицы, не могу перенести код на C++ 
:(
    Опции темы
Vinouser
Дата 27.12.2013, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 27.12.2013

Репутация: нет
Всего: нет



Соседом элемента a[i][j] матрицы называется другой элемент a[i][k] этой же матрицы, если каждый из индексов l и k отличается соответственно от i и j не более, чем на единицу. Дана вещественная матрица M x N. Построить матрицу B такого же размера, чтобы каждый элемент b[i][j] этой матрицы был равен наименьшему значению среди соседей элемента a[i][j].

Помогите пожалуйста перенести код с Паскаля на C++. Получается совсем не то, что нужно.

Вот код на Паскале:
Код

program PROGMatrix;
uses crt;
const n=4;m=5;
var a,b:array[1..m,1..n] of real;
    min:real;
    i,j,k,l,p,t,p1,t1:integer;
Begin
  clrscr;
 
{создаем массив чисел}
  randomize; 
  writeln('Исходный массив');
  for i:=1 to m do
   begin
    for j:=1 to n do
      begin
        a[i,j]:=random(50)/11;
        write(a[i,j]:0:2,'  ');
      end;
       writeln;
   end;
 
   for i:=1 to m do
    for j:=1 to n do
     begin
      min:=maxint;
    for k:=i-1 to i+1 do
      for l:=j-1 to j+1 do
 
    if ((k>=1) and (k<=m)) and ((l>=1)and (l<=n)) and ((i<>k) xor (j<>l))then
         begin
           if (a[k,l]<min) and (a[k,l]<>a[i,j]) then
             begin
               min:=a[k,l];
             end;
           b[i,j]:=min;
           end;
      end;
 
 
         writeln;
         writeln('полученный массив');
         for i:=1 to m do
           begin
             for j:=1 to n do write(b[i,j]:0:2,'  ');
             writeln;
           end;
         readln;
 
end.


Вот на C++:
Код

#include <iostream>
#include <cmath>
#include <iomanip>
#include <ctime>
#include <cstdlib>
using namespace std;
 
void main()
{
    system("cls");
    setlocale(0,"");
    srand(time(NULL));
    int m,n;
    int i,j,k,l;
    float min;
    cout << "Количество строк матрицы: "; cin >> m;
    cout << "Количество столбцов матрицы: "; cin >> n;
    float **a = new float *[m];
    float **b = new float *[m];
    for (int i=0; i<m; i++)
    {
        a[i] = new float[n];
        b[i] = new float[n];
    }
 
    cout << endl << "Исходная матрица:\n\n";
    for (i=0; i<m; i++)
    {
        for (j=0; j<n; j++)
        {
            a[i][j] = rand()/(float)32767*20-10; //(double)rand() / ((double)rand() + 0.1) 
            cout << setw(7) << setprecision(3) << a[i][j] << setprecision(3) << setw(7);
            //cout << "A[" << i << "][" << j << "] = "; cin >> a[i][j];
        }
        cout << endl << endl;
    }
    
    min = a[0][0];
 
    for (i=0; i<m; i++)
    {
        for (j=0; j<n; j++)
        {
            for (k=(i-1); k<(i+1); k++)
            {
                for (l=(j-1); l<(j+1); l++)
                {
                    // тут , я как понимаю нужна операция XOR, но вдруг ошибаюсь
                    if ( ( (k>=1) && (k<=m) ) && ( (l>=1) && (l<=n) ) && ( (i!=k) ^ (j!=l) ) )
                    {
                        if ((a[k][l]<min) && (a[k][l] != a[i][j]))
                        {
                            min = a[k][l];
                        }
                        b[i][j] = min;
                    }
                }
            }
        }
    }
 
    cout << endl;
 
    for (int i=0; i<m; i++)
    {
        for (int j=0; j<n; j++)
        {
            cout << setw(7) << setprecision(3) << b[i][j] << setprecision(3) << setw(7); 
        }
        cout << endl << endl;
    }
 
    system("pause>>void");
}

PM MAIL   Вверх
xvr
Дата 27.12.2013, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Ошибка в строке 49 - индексы в С начинаются с 0, а не с 1, как в Pascal. Поэтому и проверки на границы матриц будут другие (первые 4 сравнения)

PM MAIL   Вверх
Vinouser
Дата 27.12.2013, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 27.12.2013

Репутация: нет
Всего: нет



Код

for (i=0; i<m; i++)
    {
        for (j=0; j<n; j++)
        {
            for (k=(i-1); k<(i+1); k++)
            {
                for (l=(j-1); l<(j+1); l++)
                {
                    // здесь заменил k>=0 и l>=0 
                    if ( ( (k>=0) && (k<=m) ) && ( (l>=0) && (l<=n) ) && ( (i!=k) ^ (j!=l) ) )
                    {
                        if ((a[k][l]<min) && (a[k][l] != a[i][j]))
                        {
                            min = a[k][l];
                        }
                        b[i][j] = min;
                    }
                }
            }
        }
    }
 


я правильно понял?
если да, то ответ не правильный выдаёт. да и операция исключающего или (xor) в C++ точно как ^ крышечка обозначается или как то можно заменить?
PM MAIL   Вверх
feodorv
Дата 27.12.2013, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(Vinouser @  27.12.2013,  15:30 Найти цитируемый пост)
                    // здесь заменил k>=0 и l>=0 

А k<m и l<n?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
feodorv
Дата 28.12.2013, 07:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Нет, всё-таки решительно не понимаю, зачем здесь ^. Если смысл его в исключении оригинального элемента, то всё это записывается как
Код
(i != k || j != l)
 XOR же делает несколько иное...


Решительно не понимаю и этого:
Цитата(Vinouser @  27.12.2013,  15:30 Найти цитируемый пост)
                        if ((a[k][l]<min) && (a[k][l] != a[i][j]))
Зачем здесь сравнение со значением оригинального элемента матрицы? Нельзя, чтобы минимальное значение среди соседей совпадало со значением самого элемента? Почему?


Ещё более решительно  smile не понимаю, почему min инициализируется один раз для всех элементов сразу:
Цитата(Vinouser @  27.12.2013,  12:14 Найти цитируемый пост)
    min = a[0][0];
Ведь искать минимальный элемент нужно только среди соседей, никак не среди остальных минимальных элементов. К тому же для элемента a[0][0] минимальное значение среди его соседей инициализируется самим значением этого элемента, а не значением какого-нибудь соседа, что в корне не верно. В программе на паскале инициализация min правильно происходит внутри циклов по i и j и правильным значенеием
Цитата(Vinouser @  27.12.2013,  12:14 Найти цитируемый пост)
      min:=maxint;





--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Vinouser
  Дата 29.12.2013, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 27.12.2013

Репутация: нет
Всего: нет



Всё исправил всё работает как надо . Тема закрыта
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0860 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.