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

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Sozer
Сообщения: 6
Зарегистрирован: 18 май 2004, 14:48
Контактная информация:

Задача вот такая:В заданной целочисленной матрице Ам*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();
}
Hawk
Сообщения: 216
Зарегистрирован: 17 фев 2004, 14:52
Откуда: СПб
Контактная информация:

Как я понимаю под указателями ты имеешь ввиду динамический массив? если так, то надо только изменить в начале

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

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. писался код прямо здесь, так что за абсолютную синтаскическую правильность не ручаюсь, и попрошу тупо не копировать в свой код а подумать всетаки куда и как
Sozer
Сообщения: 6
Зарегистрирован: 18 май 2004, 14:48
Контактная информация:

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

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

не до понял я....
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

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

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

BOOL  -> bool
FALSE -> false
TRUE  -> true
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Hawk
Сообщения: 216
Зарегистрирован: 17 фев 2004, 14:52
Откуда: СПб
Контактная информация:

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

Странный у тебя С++
Hup
Сообщения: 207
Зарегистрирован: 05 мар 2004, 05:31
Откуда: Владивосток
Контактная информация:

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

P>S> Без обид, но это даже слишком
Усложнять - легко, упрощать - сложно
Hup
Сообщения: 207
Зарегистрирован: 05 мар 2004, 05:31
Откуда: Владивосток
Контактная информация:

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

#define TRUE 1
#define FALSE 0
Что касается BOOL, то самый простой вариант заменить его на int или даже short. А можно и повыпендриваться сделав через typedef :wink:
Усложнять - легко, упрощать - сложно
Асия
Сообщения: 12
Зарегистрирован: 26 апр 2004, 21:19
Контактная информация:

Да ладно вам=)
Ну не знает человек ... не надо уж издеваться то=)
А серьезно .. если заменить BOOL на bool, TRUE на true, FALSE на false усе должно сработать
Конструктор
Сообщения: 35
Зарегистрирован: 12 май 2004, 15:34
Откуда: Москва

А серьезно .. если заменить BOOL на bool, TRUE на true, FALSE на false усе должно сработать
Только вот если человек писал на Borland C++ 3.1 ему это вряд ли поможет. :)
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Тогда выход такой:

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

enum { FALSE = 0, TRUE } BOOL;
После приведённый участок кода будет справедлив.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить