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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2011, 21:16   #1
just_dake
Пользователь
 
Регистрация: 01.03.2011
Сообщений: 39
По умолчанию Матрицы в СИ.

Всем привет!
У меня такая задача: Дана действительная матрица размера n x m. Найти значение наибольшего по модулю элемента матрицы, а также индексы какого-нибудь элемента с найденным значением модуля.
Мой код таков:
Код:
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<stdlib.h>
#define n 4
#define m 5
int main()
{
int a[n][m];
int i,j,index_i,index_j;
int max;
clrscr();
randomize();
printf("Randomnaya matrica:\n\n");
for(i=0;i<n;i++)
 {for(j=0;j<m;j++)
  {a[i][j]=rand()%100-50;
   printf(" %i",a[i][j]);
  }
printf("\n\n");
 }
max=abs(a[0][0]);
for(i=0;i<n;i++)
 for(j=0;j<m;j++)
if(abs(a[i][j])>max)
max=abs(a[i][j]);
printf("Max=%i\n\n",max);
for(i=0;i<n;i++)
 {for(j=0;j<m;j++)
  {if(abs(a[i][j])>max)
   max=abs(a[i][j]);
   index_i=i;
   index_j=j;}
 }
printf("Index_i=%i",index_i);
printf(" Index_j=%i",index_j);
getch();
}
index_i и j равны 3 и 4 соответственно. Почему?
just_dake вне форума Ответить с цитированием
Старый 29.03.2011, 10:07   #2
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Цитата:
index_i и j равны 3 и 4 соответственно. Почему?
А что не устраивает?
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 29.03.2011, 10:22   #3
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
index_i и j равны 3 и 4 соответственно. Почему?
Потому, что массив размером 4 х 5.
При работе с массивами используется нумерация индексов начинающаяся с нуля.
Тоесть при объявлении массива мы записываем a[4], на самом же деле массив имеет индексы 0-3 (как видим в него входят всё те-же 4 элемента.).
В циклах мы делаем проверку i < n и j < m. Если бы мы делали проверку i <= n то получили бы переполнение массива (для C++ это чревато серьёзными последствиями поскольку компилятор не делает проверку на переполнение).
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 29.03.2011, 17:50   #4
just_dake
Пользователь
 
Регистрация: 01.03.2011
Сообщений: 39
По умолчанию

Цитата:
Сообщение от Mandrivnyk Посмотреть сообщение
А что не устраивает?
Вы кажется не поняли мне нужны индексы наибольшего элемента по модулю.
Не устраивает то , что index_i и index_j постоянно выдают эти две цифры.
just_dake вне форума Ответить с цитированием
Старый 29.03.2011, 18:26   #5
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

ну вместо randomize();
напиши srand(time(0));
+include <time.h>
onewho вне форума Ответить с цитированием
Старый 29.03.2011, 18:52   #6
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от just_dake Посмотреть сообщение
Код:
...
for(i=0;i<n;i++)
 {for(j=0;j<m;j++)
  {if(abs(a[i][j])>max)    // ТЕЛО БЛОКА if !!!
   max=abs(a[i][j]);
   index_i=i;      
   index_j=j;}
 }
...
Ну и случай, когда единственным максимумом окажется a[0][0], осталось предусмотреть...

Added 17:02 CET
И знак в выделенном if'е должен быть >= , а не > .

Последний раз редактировалось Vago; 29.03.2011 в 19:01.
Vago вне форума Ответить с цитированием
Старый 29.03.2011, 22:07   #7
just_dake
Пользователь
 
Регистрация: 01.03.2011
Сообщений: 39
По умолчанию

Люди всем спасибо конечно, но мне нужно вывести ИНДЕКСЫ максимального по модулю элемента. У меня выводит только число строк и столбцов.
just_dake вне форума Ответить с цитированием
Старый 29.03.2011, 22:38   #8
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Ещё раз. Медленно... Два оператора, которые должны находиться в блоке if, у Вас в него не попали. Не нужно экономить на операторных скобках! Должно быть:
Код:
   ...
   for ( i=0; i<n; i++ ) {
      for ( j=0; j<m; j++ ) {
         if ( abs(a[i][j]) >= max ) {
            max = abs(a[i][j]) ;
            index_i = i ;
            index_j = j ;
         }
      }
   }
   printf("Index_i= %d", index_i);
   printf(" Index_j= %d", index_j);
   ...
Vago вне форума Ответить с цитированием
Старый 29.03.2011, 22:48   #9
just_dake
Пользователь
 
Регистрация: 01.03.2011
Сообщений: 39
По умолчанию

Блин опять я со скобками туплю, все теперь вышло, спасибо вам большое!
just_dake вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TurboPascal: графы, матрицы смежности и матрицы инцидентности. ulala Помощь студентам 1 03.03.2011 19:28
Ф-ия, определяющая сумму строк матрицы, если на главной диагонали матрицы имеется отрицательный эл-т. Volk_xD Помощь студентам 6 05.01.2011 13:39
Матрицы:функция изменения порядка столбцов матрицы Fajyz Помощь студентам 0 13.01.2010 09:40
На главную диагональ матрицы поместить наибольшие элементы этой матрицы mivel Помощь студентам 2 23.12.2009 21:19