Страница 1 из 2

Задачка на С++ помогите plz!

Добавлено: 18 май 2004, 14:55
Sozer
Задача вот такая:В заданной целочисленной матрице Ам*n среди строк содержащих только нечётные элементы, найти строку с max суммой модулей элементов...
нужно решить через указатели в С++.

как её переделать? что б она была через указатели...
есть решение, но не через указатели... :

#include <stdio.h>
#include <conio.h>
#define N 3 //Размер квадратной матрицы
void main()
{
int m[N][N+1]; //последний столбец используем для хранения суммы эл-тов строки
int max; //Строка с max суммой элементов
int i,j;
puts("\nОпределение строки с max суммой эл-тов");
printf("Введите матрицу %ix%i\n",N,N);
for (i=0;i<N;i++)
{
printf("Эл-ты %i-й строки ->",i+1);
for(j=0;j<N;j++)
scanf("%i",&m[j]);
}
//сумма для каждой строки
for (i=0;i<N;i++)
{
m[N]=0;
for (j=0;j<N;j++)
m[N]+=m[j];
}
//поиск строки с max суммой
max=0;
for (i=1;i<N;i++)
if(m[N]>m[max][N])
max=i;
printf("\nВ %i-й строку сумма эл-тов",max+1);
printf("max u=%i\n", m[max][N]);
printf("\nДля завершения нажмите <Enter>\n");
getch();
}

Добавлено: 19 май 2004, 09:56
Hawk
Как я понимаю под указателями ты имеешь ввиду динамический массив? если так, то надо только изменить в начале

Код: Выделить всё

int m[N][N+1];
на

Код: Выделить всё

int** m = new int*[N];
for (int k=0; k<N; k++)
 m[k] = new int[N+1];
и в конце добавить

Код: Выделить всё

for (k=0; k<N; k++)
 delete[] m[k];
delete[] m;
кроме того я неувидел определения четные ли элементы строки и кроме того второй цикл и дополнительная ячейка в каждой строке совсем не нужна. Я бы эти два цикла обьединил в один -

Код: Выделить всё

int nMax = 0;
int nIndex = 0;
int nNowMax = 0;
BOOL bIsOdd = FALSE;
for (i=0;i<N;i++) 
{ 
  //определяем сумму и проверяем на четность 
  for (j=0;j<N;j++) 
  {
     if (m[i][j]%2)
       break;
     nNowMax+=m[i][j]; 
  }
  if (j == N) //все элементы четны
  {
     if (nNowMax > nMax || !bIsOdd) //сумма больше максимальной, или ещё ни разу в nMax не записывалось ни одно значение 
     // т.е. nMax не валиден 
     {
         nMax = nNowMax;
         nIndex = i;
         bIsOdd = TRUE;
     }
  }
} 
На выходе если bIsOdd равен FALSE - ни одной строки только с четными элементами нет.
Иначе в nMax лежит максимальная сумма строки а в nIndex - индекс этой строки

P.S. писался код прямо здесь, так что за абсолютную синтаскическую правильность не ручаюсь, и попрошу тупо не копировать в свой код а подумать всетаки куда и как

Добавлено: 19 май 2004, 13:05
Sozer
Вы меня правельно поняли. Во всём разобрался, но только одного не понял:
BOOL bIsOdd = FALSE;
C++ не понимает этой строчки... а именно С++ не понимает - BOOL, вообще что это такое?

и в конце тоже самое:
bIsOdd = TRUE;
сдесь ему не нравится TRUE...

не до понял я....

Добавлено: 19 май 2004, 14:38
Romeo
Вообще С++ должно понимать С-шные декларации. Это, как минимум, странно. Короче попробуй заменить:

Код: Выделить всё

BOOL  -> bool
FALSE -> false
TRUE  -> true

Добавлено: 19 май 2004, 16:28
Hawk
[quote="Sozer"]Вы меня правельно поняли. Во всём разобрался, но только одного не понял:
BOOL bIsOdd = FALSE]

Странный у тебя С++

Добавлено: 20 май 2004, 13:46
Hup
BOOL bIsOdd = FALSE;
C++ не понимает этой строчки... а именно С++ не понимает - BOOL, вообще что это такое?
и в конце тоже самое:
bIsOdd = TRUE;
сдесь ему не нравится TRUE...
не до понял я....
Блин, я бы постыдился такое писать... Этому наверное даже в школе учат...

P>S> Без обид, но это даже слишком

Добавлено: 22 май 2004, 13:52
Hup

Код: Выделить всё

#define TRUE 1
#define FALSE 0
Что касается BOOL, то самый простой вариант заменить его на int или даже short. А можно и повыпендриваться сделав через typedef :wink:

Добавлено: 27 май 2004, 01:30
Асия
Да ладно вам=)
Ну не знает человек ... не надо уж издеваться то=)
А серьезно .. если заменить BOOL на bool, TRUE на true, FALSE на false усе должно сработать

Добавлено: 27 май 2004, 09:01
Конструктор
А серьезно .. если заменить BOOL на bool, TRUE на true, FALSE на false усе должно сработать
Только вот если человек писал на Borland C++ 3.1 ему это вряд ли поможет. :)

Добавлено: 27 май 2004, 10:35
Romeo
Тогда выход такой:

Код: Выделить всё

enum { FALSE = 0, TRUE } BOOL;
После приведённый участок кода будет справедлив.