2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Помогите написать программку С++
Сообщение08.11.2005, 00:33 


08/11/05
4
Если max и min элемент прямоугольной матрицы не попадают на заданный отрезок , определить, как изменится сумма элементов матрицы в случае замены всех элементов , выходящих за границы заданного отрезка ,соответствующими границами .

Пожалуйста, напишите решение на C++

 Профиль  
                  
 
 
Сообщение08.11.2005, 09:51 
Заслуженный участник
Аватара пользователя


12/10/05
478
Казань
Три раза условие задачи прочитал, и нифига не понял, что требуется сделать. Точнее, понял только то, что решение надо на Сях написать... :(

Это что, все элементы матрицы, значения которых не попадают в некоторый интервал, надо заменить значениями начала (или конца) данного интервала?

И еще: размеры матрицы даны?

 Профиль  
                  
 
 Dianna
Сообщение08.11.2005, 10:24 


08/11/05
4
Если значения матрицы выходят за отрезок [a , b] то заменить значения матрицы этими значениями и опр как изменится сумма
элементов матрицы.
Размер массива произвольный.

 Профиль  
                  
 
 Re: Dianna
Сообщение08.11.2005, 10:48 
Заслуженный участник
Аватара пользователя


12/10/05
478
Казань
Dianna писал(а):
Если значения матрицы выходят за отрезок [a , b] то заменить значения матрицы этими значениями и опр как изменится сумма
элементов матрицы.
Размер массива произвольный.


Теперя уточним...
Если элемент матрицы меньше a, то данному элементу присваиваем а, ежели элемент больше b, то присваиваем ему b. Эту операцию проделываем со всеми элементами матрицы. Так?

 Профиль  
                  
 
 Dianna
Сообщение08.11.2005, 11:09 


08/11/05
4
ДА

 Профиль  
                  
 
 Re: Помогите написать программку С++
Сообщение08.11.2005, 11:16 


13/09/05
55
В условии все таки написано
Dianna писал(а):
всех элементов , выходящих за границы заданного отрезка

так что по моему не все элеменмы матрицы заменять надо, а только те значения которых не попадают в отрезок.
И навернео все таки на С? С++ в такой задаче наверное излишен.

 Профиль  
                  
 
 
Сообщение08.11.2005, 11:56 
Заслуженный участник
Аватара пользователя


12/10/05
478
Казань
Вот, держи оно даже компилится:

код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <stdlib.h>
#include <stdio.h>

#define WIDTH  10 //Ширина матрицы.
#define HEIGHT 10 //Высота матрицы.

double compare(double **matr, double a, double b, int width, int height);
double sum(double **matr, int width, int height);

int main(int n, char **args)
{
    if(n < 3)
    {
        puts("usage: matr a b\0");
        return -1;
    }
    double a = atof(args[1]),
           b = atof(args[2]);

    double matr[WIDTH][HEIGHT];
//......
//здеся надо заполнить matr элементами.

    a = compare((double **)matr, a, b, WIDTH, HEIGHT);
    if(a > 0)
        puts("Сумма стала больше.");
    else if(a < 0)
        puts("Сумма стала меньше.");
    else
        puts("Сумма не изменилась.");
    return 0;
}


double compare(double **matr, double a, double b, int width, int height)
{
    double res = sum(matr, width, height);
    int tmp1 = width;
    while(tmp1--)
    {
        int tmp2 = height;
        while(tmp2--)
            if(matr[tmp1][tmp2] < a)
                matr[tmp1][tmp2] = a;
            else if (matr[tmp1][tmp2] > b)
                matr[tmp1][tmp2] = b;
    }
    return res-sum(matr, width, height);
}


double sum(double **matr, int width, int height)
{
    double res = 0;
    while(width--)
    {
        int tmp = height;
        while(tmp--)
            res += matr[width][tmp];
    }
    return res;
}



Только там надо вписать код, который будет заполнять матрицу (или загружать из файла).

 Профиль  
                  
 
 Помогите написать программку С++
Сообщение08.11.2005, 12:13 
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <memory.h>
#define FLOAT float
#define UINT unsigned int
class CMatrix
{
        UINT _i,_j;
        FLOAT *_data;
public:
        CMatrix();
        virtual ~CMatrix();
        void Initialize(UINT i,UINT j,FLOAT *data);
        FLOAT getMin();
        FLOAT getMax();
        FLOAT getDiffSumm(FLOAT min,FLOAT max) const;
        FLOAT getSumm() const;
};
CMatrix::CMatrix():_i(0),_j(0),_data(0)
{
}
CMatrix::~CMatrix()
{
        delete[]_data;
}
void CMatrix::Initialize(UINT i,UINT j,FLOAT *data)
{
        _i=i,_j=j;
        if(_data)
                delete[]_data;
        _data=new FLOAT[_j*_i];
        memcpy(_data,data,sizeof(FLOAT)*_i*_j);
}
FLOAT CMatrix::getMin()
{
        FLOAT min=_data[0];
        UINT i;
        for(i=1;i<_i*_j-1;i++)
                if(min<_data[i])
                        min=_data[i];
        return min;
}
FLOAT CMatrix::getMax()
{
        FLOAT max=_data[0];
        UINT i;
        for(i=1;i<_i*_j-1;i++)
                if(max<_data[i])
                        max=_data[i];
        return max;
}
FLOAT CMatrix::getSumm() const
{
        FLOAT summ=0;
        UINT i;
        for(i=0;i<_i*_j;i++)
                summ=summ+_data[i];
        return summ;
}
FLOAT CMatrix::getDiffSumm(FLOAT min,FLOAT max)const
{
        FLOAT ret=getSumm();
        FLOAT summ=0;
        UINT i;
        for(i=0;i<_i*_j;i++)
        {
                if(_data[i]<min)
                {
                        summ=summ+min;
                }
                else
                        if(_data[i]>max)
                        {
                                summ=summ+max;
                        }
                        else summ=summ+_data[i];
        }
        return (ret-summ);
}
int main(void)
{
        FLOAT data[9]={0,1,2,3,4,5,6,7,8};
        CMatrix matr;
        matr.Initialize (3,3,data);
        FLOAT diff=matr.getDiffSumm (2,7);
        return 0;
}

  
                  
 
 
Сообщение08.11.2005, 12:16 
Заслуженный участник
Аватара пользователя


12/10/05
478
Казань
Вот ишшо упрощенный вариант (тож прогнал через компилятор):

код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <stdlib.h>
#include <stdio.h>

#define WIDTH  10 //Ширина матрицы.
#define HEIGHT 10 //Высота матрицы.

double compare(double **matr, double a, double b, int width, int height);

int main(int n, char **args)
{
    if(n < 3)
    {
        puts("usage: matr a b\0");
        return -1;
    }
    double a = atof(args[1]),
           b = atof(args[2]);

    double matr[WIDTH][HEIGHT];
//......
//здеся надо заполнить matr элементами.

    a = compare((double **)matr, a, b, WIDTH, HEIGHT);
    if(a > 0)
        puts("Сумма стала больше.");
    else if(a < 0)
        puts("Сумма стала меньше.");
    else
        puts("Сумма не изменилась.");
    return 0;
}


double compare(double **matr, double a, double b, int width, int height)
{
    double res1 = 0,
           res2 = 0;
    while(width--)
    {
        int tmp = height;
        while(tmp--)
        {
            res1 += matr[width][tmp];
            if(matr[width][tmp] < a)
                res2 += a;
            else if (matr[width][tmp] > b)
                res2 += b;
            else
                res2 += matr[width][tmp];
        }
    }
    return res1-res2;
}

 Профиль  
                  
 
 
Сообщение08.11.2005, 12:30 


13/09/05
55
Sanyok писал(а):
Вот ишшо упрощенный вариант (тож прогнал через компилятор):

По моему в таком варианте однозначно зарубят, т.к. условию не соттветствует. Sanyok, если позволите я подправлю ваш вариант и чуть позже выложу.

---
Добавка.
Ну что про первую часть условия все забыли, про это я уже не говорю, хотя и там есть где попутаться. Кстати если уж писать на плюсах, то может тогда и класс отрезка определить и операцию проверки принадлежности к нему определить , что бы все по честному уж.

 Профиль  
                  
 
 Помогите написать программку С++
Сообщение08.11.2005, 12:30 
компилится любым компилером, инициализация матрицы и вывод - по желанию.

  
                  
 
 
Сообщение08.11.2005, 12:42 
Заслуженный участник
Аватара пользователя


12/10/05
478
Казань
serga писал(а):
Sanyok писал(а):
Вот ишшо упрощенный вариант (тож прогнал через компилятор):

По моему в таком варианте однозначно зарубят, т.к. условию не соттветствует. Sanyok, если позволите я подправлю ваш вариант и чуть позже выложу.


А какому условию не соответствует? Насколькоя я понял,
необходимо

Цитата:
определить, как изменится сумма элементов матрицы в случае замены всех элементов , выходящих за границы заданного отрезка ,соответствующими границами .


Надо лишь ОПРЕДЕЛИТЬ как изменится сумма В СЛУЧАЕ ЗАМЕНЫ - но для этого нет нужды в самой матрице значения менять.

 Профиль  
                  
 
 
Сообщение08.11.2005, 12:48 
Цитата:
Если max и min элемент прямоугольной матрицы не попадают на заданный отрезок , определить, как изменится сумма элементов матрицы в случае замены всех элементов , выходящих за границы заданного отрезка ,соответствующими границами .


С этим я конечно лоханулся
summ=summ+_data[i];

и Delphi открыты и CodeBlocks
Sorry , но ентот вариант полностью удовлетворяет условию, менять елементы не надо, т.к возможно потребуется с другими границами найти разность сумм

  
                  
 
 
Сообщение08.11.2005, 13:58 


13/09/05
153
Москва
To Sanyok:
С учетом того, что нужно просто оценить изменение суммы, саму сумму считать не нужно:)
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
...

double compare(double **matr, double a, double b, int width, int height)
{
    double res = 0;
    for (int i = 0; i < width; i++)
    {
        for (int j = 0; j < height; j++)
        {
            if (matr[i][j] < a)
                res -= matr[i][j] - a;
            else if (matr[i][j] > b)
                res2 += matr[i][j] - b;
       }
    }
    return res;
}

...

a = compare((double **)matr, a, b, WIDTH, HEIGHT);
    if (a == 0)
        puts("Минимум и максимум принадлежат заданному отрезку.");
    else if(a < 0)
        puts("Сумма стала меньше.");
    else
        puts("Сумма стала больше.");

...
 


и это все, так как если какой-нить элемент матрицы меньше нижней границы, то значит мимимум тоже меньше и, значит, нужно заменять элементы матрицы и считать новую сумму, аналогично с максимумом. Так, что определять минимум и максимум матрицы нет необходимости.
Но я так понимаю, что цель этой работы именно в определении минимума, максимума и суммы матрицы и, если нужен С++, то для этого нужно создать реализацию матрицы, которая бы все это умела:).

 Профиль  
                  
 
 
Сообщение08.11.2005, 14:12 


13/09/05
55
VLarin писал(а):
и это все, так как если какой-нить элемент матрицы меньше нижней границы, то значит мимимум тоже меньше и, значит, нужно заменять элементы матрицы и считать новую сумму, аналогично с максимумом. Так, что определять минимум и максимум матрицы нет необходимости.
Но я так понимаю, что цель этой работы именно в определении минимума, максимума и суммы матрицы и, если нужен С++, то для этого нужно создать реализацию матрицы, которая бы все это умела:).

однако ж в условии четко сказано
Цитата:
Если max и min элемент прямоугольной матрицы не попадают на заданный отрезок

т.е. в обратном случае вообще ничего больше считать не нужно, никаких сумм.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group