Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Задачка на С++.... помогите!  (Прочитано 9613 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Sozer
Гость
« : 18-05-2004 10:11 » 

Задача вот такая
В заданной целочисленной матрице Ам*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[i][j]);
}
//сумма для каждой строки
for (i=0;i<N;i++)
{
 m[i][N]=0;
 for (j=0;j<N;j++)
 m[i][N]+=m[i][j];
}
//поиск строки с max суммой
max=0;
for (i=1;i<N;i++)
 if(m[i][N]>m[max][N])
  max=i;
printf("\nВ %i-й строку сумма эл-тов",max+1);
printf("max u=%i\n", m[max][N]);
printf("\nДля завершения нажмите <Enter>\n");
getch();
}
« Последнее редактирование: 25-11-2007 21:34 от Алексей1153++ » Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 18-05-2004 10:45 » 


Что значить "через указатели"?

Насколько я могу это понять, надо продемонстрировать умение пользоваться арифметикой указателей.  В таком случае можно воспользоваться такой подсказкой:  для массивов m[i] эквивалентно *(m + i)

Соответственно , m[i][j] == *(*(m + i) + j)

« Последнее редактирование: 25-11-2007 21:35 от Алексей1153++ » Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Sozer
Гость
« Ответ #2 : 18-05-2004 11:03 » 

нужно что б в этой задаче присутствовало освобождение памяти (через функцию malloc или new).
и должны быть указатели на функции...
как всё это сделать в этой задаче? не понимаю...=(((
Записан
Skubent
Гость
« Ответ #3 : 18-05-2004 12:24 » new

таки если это С++, то только new и delete, никаких malloc'ов
Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 18-05-2004 12:38 » 

Я знаю, это непедагогично -- показывать готовое решение, но наставлять и подталкивать мне влом.  Проще один раз показать, чем десять раз объяснять

Код:
#include <iostream>

const int N = 3;

typedef int * intArray;

int main()
{
    int ** m = new (int *)[N];
    // intArray * m = new intArray[N];
   
    for (int i=0; i<N; i++)
    {
        m[i] = new int[N+1];
        // Хранить сумму в первой ячейке массива
        for (int j = 1; j<= N; j++)
        {
            // Запросить у пользователя числа
            std::cout << "Введите элемент матрицы[ " << i << ", " << j << "] :";
            std::cin >> m[i][j];
        }
    }

    //
    // ЗДЕСЬ ТВОЙ КОД РАБОТЫ С МАТРИЦЕЙ
    //

    // После того, как вычислены нужные значения, память надо освободить
    for (int i=0; i<N; i++)
    {
        delete m[i];
    }
    delete m;
}
« Последнее редактирование: 25-11-2007 21:36 от Алексей1153++ » Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Migmile
Помогающий

ru
Offline Offline

« Ответ #5 : 18-05-2004 14:34 » 

npak,  только правильнее, кажется, так
delete[] m;   (хотя для встроенных типов это равносильно:))))
Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 18-05-2004 15:30 » 

Migmile, согласен.

Ещё вариант, в котором память отводится одним куском, без накладных расходов на несколько вызовов new.  Это можно, так как многомерные массивы в C++ адресуются так же, как в C -- линейно.

Код:
#include <iostream>

const int N = 3;

typedef int matrix[N][N+1];

int main()
{
    matrix * p_m = reinterpret_cast<matrix *>(new int[N*(N+1)]);
    matrix & m = *p_m;
   
    for (int i=0; i<N; i++)
    {
        // Хранить сумму в первой ячейке массива
        m[i][0] = 0;
        for (int j = 1; j<= N; j++)
        {
            // Запросить у пользователя числа
            std::cout << "Введите элемент матрицы[ " << i << ", " << j << "] :";
            std::cin >> m[i][j];
            m[i][0] += m[i][j];
        }
    }

    //
    // ЗДЕСЬ ТВОЙ КОД РАБОТЫ С МАТРИЦЕЙ
    //
    for (int i=0; i<N; i++)
    {
        for (int j = 1; j<= N; j++)
        {
            std::cout << "элемент матрицы[ " << i << ", " << j << "] :";
            std::cout << m[i][j] << "\n";
        }
        std::cout << "Сумма элементов в строке " << i << " : };
        std::cout << m[i][0] << "\n";
    }

    delete[] p_m;
}
« Последнее редактирование: 25-11-2007 21:37 от Алексей1153++ » Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines