Страница 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 = 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
Вообще С++ должно понимать С-шные декларации. Это, как минимум, странно. Короче попробуй заменить:
Добавлено: 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
Что касается BOOL, то самый простой вариант заменить его на int или даже short. А можно и повыпендриваться сделав через typedef

Добавлено: 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
Тогда выход такой:
После приведённый участок кода будет справедлив.