Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.09.2015, 09:21   #1
krasy
Пользователь
 
Регистрация: 14.04.2015
Сообщений: 40
По умолчанию найти в массиве пары чисел разность между которыми минимальна - C++

Дан двум. массив целых чисел(10х10). Найти в этом массиве пары чисел, разница между которыми минимальна.
Например, при вводе массива:
1 50 -3
2 3 4
Программа должна выводить: 1,2 ; 2,3 ; 3,4
krasy вне форума Ответить с цитированием
Старый 20.09.2015, 09:41   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Показать код ввода массива хотя бы сможешь?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.09.2015, 09:47   #3
krasy
Пользователь
 
Регистрация: 14.04.2015
Сообщений: 40
По умолчанию

Да, могу. Я просто не понимаю как реализовать эту программу
Код:
#include<iostream>
#include<conio.h>
#include<math.h>
using namespace std;
int main()
{int a[10][10],n,m,k,s;
cout<<"n= ";cin>>n;
cout<<"m= ";cin>>m;

for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{cout<<"a["<<(i+1)<<","<<(j+1)<<"]=";cin>>a[i][j];}
krasy вне форума Ответить с цитированием
Старый 20.09.2015, 10:02   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

размеры массива небольшие, поэтому, я бы решал задачу за два полных прохода по массиву.
1-й проход. перебор всех элементов массива. Для каждого элемента массива перебираем все, расположенные правее по этой же строке и все по строках ниже текущей (считаем, что проходим по массиву слева направо и сверху вниз, как по обычному "бумажному" массиву). Для пары находим модуль разницы. Если она меньше, чем запомненная вначале (для простоты в начале разницу брать как разность любых двух элементов массива, например, первого и второго элемента первой строки:
Код:
min=abs(a[0][0]-a[0][1]);
то запоминаем очередной модуль разности, как минимальное значение.


2-й проход.
тот же самый перебор, что и в первом случае, но только если разница равна min, то выводим найденные значения.

профит.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 20.09.2015, 10:04   #5
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,964
По умолчанию

Так не пишется, хотя, для студентов - простительно. Последняя строка, посто насмешила. Почему ввод данных, в конце цикла? Нет, Вы не подумайте, что я придираюсь. Просто, так не делают.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 20.09.2015, 10:09   #6
krasy
Пользователь
 
Регистрация: 14.04.2015
Сообщений: 40
По умолчанию

Serge_Bliznykov, я так делала с самого начала, и почему-то программа выводила неверный результат. попробую еще раз.
krasy вне форума Ответить с цитированием
Старый 20.09.2015, 10:10   #7
krasy
Пользователь
 
Регистрация: 14.04.2015
Сообщений: 40
По умолчанию

Smitt&Wesson, нас так научили) скажите как делать правильно, пожалуйста
krasy вне форума Ответить с цитированием
Старый 20.09.2015, 10:21   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

krasy, не слушайте Смитта, всё у Вас нормально! (сначала выводится "приглашение" - текст, какой элемент массива нужно ввести, потом, собственно, ввод элемента).

покажите свой код, как Вы пытались перебрать пары элементов, посмотрим, где Вы ошиблись.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 20.09.2015, 10:26   #9
krasy
Пользователь
 
Регистрация: 14.04.2015
Сообщений: 40
По умолчанию

Код:
#include<iostream>
#include<conio.h>
#include<math.h>
using namespace std;
int main()
{int a[10][10],n,m;
cout<<"n= ";cin>>n;
cout<<"m= ";cin>>m;

for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{cout<<"a["<<(i+1)<<","<<(j+1)<<"]=";cin>>a[i][j];}

float min=abs(a[0][0]-a[0][1]);

for(int i=0;i<n;i++)
 for(int j=0;j<m;j++)
  if(abs(a[i][j]-a[i][j+2])<min) min=abs(a[i][j]-a[i][j+2]);
  
for(int i=0;i<n;i++)
 for(int j=0;j<m;j++) 
  if(abs(a[i][j]-a[i][j+2])==min) cout<<a[i][j]<<", "<<a[i][j+2];

getch();
return 0;
}
krasy вне форума Ответить с цитированием
Старый 20.09.2015, 11:16   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Код:
if(abs(a[i][j]-a[i][j+2])<min) min=abs(a[i][j]-a[i][j+2]);
это неправильно. тут должны быть вложенные циклы, чтобы найти элементы правее и ниже!

И вообще, почему Вы вообще написали j+2 ?!! Откуда это волшебное число?!
Можете не отвечать. Это риторический вопрос. Так делать нельзя, это неправильно!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на паскале: Разделить элементы массива на 2 группы так, что бы разность между ними была минимальна. Rhc Помощь студентам 27 31.12.2013 15:04
Найти пары чисел саша аврамов Паскаль, Turbo Pascal, PascalABC.NET 1 20.02.2013 06:54
Нахождение в массиве одинаковой пары соседних чисел mimit Помощь студентам 2 15.11.2012 11:15
Найти номера пары точек, расстояние между которыми наибольшее evgenext Помощь студентам 1 02.07.2010 22:46
Найти номера пары точек, расстояние между которыми наибольшее Nevis Помощь студентам 5 21.06.2009 23:37