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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.10.2013, 14:26   #1
zheka317
Пользователь
 
Регистрация: 10.10.2013
Сообщений: 12
По умолчанию Матрица, несколько максимальных с индексами (язык C)

Дана такая задача с матрицей: в каждой строке выбирается элемент с наибольшим значением, затем среди этих чисел выбирается наибольшее. Указать индексы элемента с найденным значением. Программу я почти написал, но выходит проблема с индексами:
Код:
int main()
{
setlocale(LC_ALL, "Russian");
int a[10][10],b[10],i,j,k,n,ni,nj,nj1,max;
printf("\n  введите размер a\n");
scanf("%d",&n);
printf("  введите элементы a\n");
  for(i=0;i<n;i++)
    for(j=0;j<n;j++)
    scanf("%d",&a[i][j]);
  //поиск max в матрице А
ni=0;nj=0;
  for(i=0;i<n;i++)
  {
  max=a[i][0];
    for(j=0;j<n;j++)
    {
	//перенос max в массив B
      if(max<a[i][j])
      {
      max=a[i][j];ni=i;nj=j;
      }
    b[i]=max;
    }
  }
  //вывод матрицы
printf("  Ваша матрица :\n\n");
  for(i=0;i<n;i++)
  {
    for(j=0;j<n;j++)
    printf("%d  ",a[i][j]);
    printf("\n\n");
  }
  //вывод массива В
printf("  Новый массив B :\n\n");
  for(i=0;i<n;i++)
  printf("элемент  B[%d]\n",b[i]);
  //поиск max в массиве В
max=b[0];
  for(i=0;i<n;i++)
    if(max<b[i])
    {
    max=b[i];
    }
	//вывод рез-а
ni++;nj++;
printf("\n  самый max = %d\n",max);
printf("  его индексы = %d строка %d столбец\n",ni,nj);
getch();
}
Заранее спасибо.
zheka317 вне форума Ответить с цитированием
Старый 10.10.2013, 14:38   #2
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,680
По умолчанию

Интересно
У Вас указана размерность
Код:
a[10][10]
т.е. 10 на 10
и тут же вы вводите количество элементов... Для чего???
Скажу по другому, нет необходимости вводить размер n , если он итак равен 10
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 10.10.2013, 15:05   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Bugrimov Посмотреть сообщение
Интересно
У Вас указана размерность
Код:
a[10][10]
т.е. 10 на 10
и тут же вы вводите количество элементов... Для чего???
Скажу по другому, нет необходимости вводить размер n , если он итак равен 10
почему это n=10 ? если пользователь введёт 3, то будут заполнены первые три значения из 10 (т.е. с точки зрения пользователя программы массив будет выглядеть как 3x3 )
и идеологически тут чувствуется тлетворное влияние Паскаля, где были только статические массивы.
думаю, что тут возможно (а может быть - и нет, нельзя, я в С не компетентен ) было написать что-то вроде:
Код:
  int i,j,k,n,ni,nj,nj1,max;
  printf("\n  введите размер a\n");
  scanf("%d",&n);
  int a[n][n], b[n];
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.10.2013, 15:13   #4
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
что тут возможно (а может быть - и нет, нельзя, я в С не компетентен ) было написать что-то вроде:
Нельзя.. Нужно или использовать статические с достаточно большим диапазоном либо использовать динамические массивы (с помощью malloc и calloc)
Poma][a вне форума Ответить с цитированием
Старый 10.10.2013, 15:17   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Poma][a Посмотреть сообщение
Нельзя.. Нужно или использовать статические с достаточно большим диапазоном либо использовать динамические массивы (с помощью malloc и calloc)
Понятно. Спасибо за комментарий.

Тогда sorry за попытку (невольную) ввести в заблуждение!


zheka317, проблема в том, что Вы плохо себе представляете, как работают циклы.
Цитата:
Код:
max=a[i][j];ni=i;nj=j;
то, что я выделил красным - так, как Вы расчитываете, работать НЕ БУДЕТ!

предлагаю такой вариант:
Код:
int main()
{
setlocale(LC_ALL, "Russian");
int a[100][100],b[100],i,j, n, maxInd;
printf("\n  введите размер a\n");
scanf("%d",&n);
printf("  введите элементы a\n");
  for(i=0;i<n;i++)
    for(j=0;j<n;j++)
      scanf("%d",&a[i][j]);

  //поиск max в матрице А
  for(i=0;i<n;i++)
  {
    b[i] = 0;
    for(j=1;j<n;j++)
    {
        //перенос max в массив B
      if (a[i][b[i]]<a[i][j])
      {
        b[i] = j;
      }
    }
  }
  //вывод матрицы
  printf("  Ваша матрица :\n\n");
  for(i=0;i<n;i++)
  {
    for(j=0;j<n;j++)
    printf("%d  ",a[i][j]);
    printf("\n\n");
  }
  //вывод массива В
  printf("  Новый массив B :\n\n");
  for(i=0;i<n;i++)
    printf("элемент  B[%d] = %d\n",i,a[i][b[i]]);
  //поиск max в массиве В
  maxInd = b[0];
  for(i=1;i<n;i++)
    if(a[i][maxInd]<a[i][b[i]])
    {
      maxInd = b[i];
    }
        //вывод рез-а
 printf("\n  самый max = %d\n", a[maxInd][b[maxInd]]);
 printf("  его индексы = %d строка %d столбец\n", maxInd+1, b[maxInd]+1);
 getch();
}
ключ в моём алгоритме - храним в массиве B не сами значения (они же есть в исходном массиве A), а номера столбцов с максимальным значением. Если это поймёте, то остальное уже всё просто

p.s. КОД НЕ ПРОВЕРЯЛ!

Последний раз редактировалось Serge_Bliznykov; 10.10.2013 в 16:02.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.10.2013, 16:01   #6
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,680
По умолчанию

Есть некая оптимизация... Возьму на заметку...
А по поводу своего поста, я вел речь о том, что память необходимо выделять ровно столько сколько ее необходимо... как-то вот так...
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 10.10.2013, 16:47   #7
Helloween
Форумчанин
 
Регистрация: 24.04.2012
Сообщений: 300
По умолчанию

Задача сводится к поиску максимального элемента в массиве. Все за один проход.
Код:
#include "stdio.h"
#include "stdlib.h"
#include "time.h"

int main()
{
	size_t asize = 0;
	printf("ARRAY SIZE:\n");
	scanf("%d",&asize);
	int** arr = new int*[asize];
	int max = 0;
	int x = 0,y = 0;
	unsigned long seed = time(NULL);
	srand(seed);
	for(size_t i = 0; i < asize; i++)
	{
		arr[i] = new int[asize];
		for(size_t j = 0; j < asize; j++)
		{
		   arr[i][j] = rand()%100 + 1;
		   if(arr[i][j] > max)
		   {
			 max = arr[i][j];
			 x = i;
			 y = j;
		   }
		   printf("%4d",arr[i][j]);
		}
		printf("\n");
	}
	printf("MAX INDEX: STRING:%d COLUMN:%d",x + 1,y + 1);
	for(size_t i = 0; i < asize; i++)
	  delete [] arr[i];
	delete [] arr;    
	return 0;
}
Помог? Оставляем отзыв =)
Helloween вне форума Ответить с цитированием
Старый 10.10.2013, 19:34   #8
zheka317
Пользователь
 
Регистрация: 10.10.2013
Сообщений: 12
По умолчанию

Ваш код хорош, но если я так напишу, никто не поверит, что задачу выполнял я сам - мы такое ещё не прошли. Но всё равно спасибо.
zheka317 вне форума Ответить с цитированием
Старый 10.10.2013, 19:40   #9
zheka317
Пользователь
 
Регистрация: 10.10.2013
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение

ключ в моём алгоритме - храним в массиве B не сами значения (они же есть в исходном массиве A), а номера столбцов с максимальным значением. Если это поймёте, то остальное уже всё просто
И всё равно, при компиляции вашего кода получается та же самая ошибка, что и у меня: если ввести размер матрицы 2 и значения (1,3,4,2), то программа верно найдёт максимальный элемент - 4, но неверно укажет его позицию - 1 строка, 2 столбец, а должно быть наоборот; с этого, собственно, всё и началось.
zheka317 вне форума Ответить с цитированием
Старый 10.10.2013, 19:55   #10
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

ИМХО, всё верно! тыц
Poma][a вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дана квадратная матрица А из N элементов. Получить из нее одномерный массив, прочитав(язык си+++) mitja-zakelidis Помощь студентам 7 17.03.2012 15:23
Дана квадратная матрица А из N элементов. Получить из нее одномерный массив(язык с++) yury.zanilov Помощь студентам 6 16.03.2012 13:46
Несколько условных операторов. Язык программирования Delphi 7 ZigFree Помощь студентам 0 27.12.2010 20:03
Целочисленная матрица (язык Pelles C) Kotik Wasil Помощь студентам 0 12.12.2010 20:42
Матрица Язык (Паскаль) Азарт Помощь студентам 1 14.04.2009 00:09