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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.10.2009, 16:07   #1
Arcueid1691
Пользователь
 
Аватар для Arcueid1691
 
Регистрация: 31.05.2009
Сообщений: 97
По умолчанию поиск второго максимума

задание найти второй максимум в матрице. Есть вот такой алгоритм:
1. находим MAX1;
2. Заменяем его на заведомо малое число;
3. Повторяем процедуру поиска.

Если я напишу вот так:
Код:
	m1=0;
	for(int i=0;i<x;++i)
   		{for(int j=0;j<y;++j)
			{if (a[i][j] >m1)  {m1 = a[i][j];
							}
			}
			a[i][j]=0;
		}
Какие в этом случае обнулится максимальный элемент матрицы или в процессе поиска обнулятся все элементы матрицы, которые больше нуля?
спят подружки вредные безмятежным сном,
Снятся мышкам хлебные крошки под столом, Буратинам - досточки, кошкам - караси,
Всем собакам - косточки, программистам - Си (с)
Arcueid1691 вне форума Ответить с цитированием
Старый 15.10.2009, 17:05   #2
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

Цитата:
Сообщение от Arcueid1691 Посмотреть сообщение
Какие в этом случае обнулится максимальный элемент матрицы или в процессе поиска обнулятся все элементы матрицы, которые больше нуля?
Мой мозг отказывается интерпретировать эту фразу
Алгоритм намного проще:
1. max1 = A[1][1]; max2 = A[1][1];
2. Бежим по матрице.
а) если очередной элемент <= max2, то бежим дальше
б) если он > max2, но < max1, то max2 = A[i][j]
в) если он >= max1, то max2 = max1; max1 = A[i][j]
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Старый 15.10.2009, 17:08   #3
mYziK
Пользователь
 
Регистрация: 18.09.2009
Сообщений: 38
По умолчанию

Эм, по-идее это не будет компилироваться:
Код:
   m1=0;
   for(int i=0;i<x;++i)
   {
      for(int j=0;j<y;++j)
      {
         if (a[i][j] >m1)  
            m1 = a[i][j];
      }
      a[i][j]=0;
   }
Переменная j у тебя существует только в области видимости вложенного цикла (только что проверил, Visual Studio 2005 ругается на нее в строчке
Код:
a[i][j]=0;
Если объявить счетчики вне циклов, то в той же злочастной строчке:
Код:
a[i][j]=0;
j будет равен y (последнее значение j, не удовлетворяющее условию). У меня в той же вижуалке он обнулил первые элементы каждой строки начиная со первой (нулевую пропустил).
И естесственно сругался "stack corrupted", т.к. на последней итерации обнуляет элемент a[2][3], что уже за пределами памяти матрицы.

А почему бы не находить сразу два максимума?
Код:
	int m1=0;
	int m2=0;
	for(int i=0;i<x;++i)
   	{
		for(int j=0;j<y;++j)
		{
			if (a[i][j] > m1)  
			{
				m1 = a[i][j];
			}else
			{
				if(a[i][j] > m2)  
					m2 = a[i][j];
			}
		}
	}
В итоге m2 будет второй максимум. Если нужен уникальный, т.е. в последовательности:
96 47 53 12 0 96 45
второй максимум - 53, то
Код:
if (a[i][j] > m1)
надо поменять на
Код:
if (a[i][j] >= m1)
mYziK вне форума Ответить с цитированием
Старый 15.10.2009, 17:14   #4
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

2mYziK
Код:
if (a[i][j] > m1)  {
    m1 = a[i][j];
}
После этого в m2 у Вас будет третий максимум
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Старый 15.10.2009, 17:21   #5
mYziK
Пользователь
 
Регистрация: 18.09.2009
Сообщений: 38
По умолчанию

Упс, да, туплю... Голова уже не варит...
mYziK вне форума Ответить с цитированием
Старый 15.10.2009, 18:16   #6
Arcueid1691
Пользователь
 
Аватар для Arcueid1691
 
Регистрация: 31.05.2009
Сообщений: 97
По умолчанию

Цитата:
Переменная j у тебя существует только в области видимости вложенного цикла (только что проверил, Visual Studio 2005 ругается на нее в строчке
да что то я совсем одурела...


Спасибо большое за помощь!!! =)
спят подружки вредные безмятежным сном,
Снятся мышкам хлебные крошки под столом, Буратинам - досточки, кошкам - караси,
Всем собакам - косточки, программистам - Си (с)
Arcueid1691 вне форума Ответить с цитированием
Старый 15.10.2009, 21:26   #7
breate
Пользователь
 
Аватар для breate
 
Регистрация: 30.12.2008
Сообщений: 78
По умолчанию

я предложил бы по другому:
for(int i=0;... = fori

Код:
fori
{
forj
{
if(a[i][j]>max1){
max2=max1;
max1=a[i][j];}
}
}
Моя работа - Создание сайтов
breate вне форума Ответить с цитированием
Старый 15.10.2009, 22:43   #8
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

breate, ну и получили бы неправильно работающую программу
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск Максимума в двумерном массиве NSvirus Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 20.09.2009 18:04
поиск максимума.(16 бит,uns – число без знака) JNN Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 04.06.2009 23:24
2 максимума в массиве Arcueid1691 Общие вопросы C/C++ 4 01.06.2009 02:30
Загружается со второго раза Xardas Компьютерное железо 10 10.03.2008 08:51
3 максимума из N чисел Artem1987 Помощь студентам 2 23.12.2007 09:08