2014 dxdy logo

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

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




На страницу 1, 2  След.
 
 Помогите написать программку С++
Сообщение08.11.2005, 00:33 
Если max и min элемент прямоугольной матрицы не попадают на заданный отрезок , определить, как изменится сумма элементов матрицы в случае замены всех элементов , выходящих за границы заданного отрезка ,соответствующими границами .

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

 
 
 
 
Сообщение08.11.2005, 09:51 
Аватара пользователя
Три раза условие задачи прочитал, и нифига не понял, что требуется сделать. Точнее, понял только то, что решение надо на Сях написать... :(

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

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

 
 
 
 Dianna
Сообщение08.11.2005, 10:24 
Если значения матрицы выходят за отрезок [a , b] то заменить значения матрицы этими значениями и опр как изменится сумма
элементов матрицы.
Размер массива произвольный.

 
 
 
 Re: Dianna
Сообщение08.11.2005, 10:48 
Аватара пользователя
Dianna писал(а):
Если значения матрицы выходят за отрезок [a , b] то заменить значения матрицы этими значениями и опр как изменится сумма
элементов матрицы.
Размер массива произвольный.


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

 
 
 
 Dianna
Сообщение08.11.2005, 11:09 
ДА

 
 
 
 Re: Помогите написать программку С++
Сообщение08.11.2005, 11:16 
В условии все таки написано
Dianna писал(а):
всех элементов , выходящих за границы заданного отрезка

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

 
 
 
 
Сообщение08.11.2005, 11:56 
Аватара пользователя
Вот, держи оно даже компилится:

код: [ скачать ] [ спрятать ]
Используется синтаксис 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 
Аватара пользователя
Вот ишшо упрощенный вариант (тож прогнал через компилятор):

код: [ скачать ] [ спрятать ]
Используется синтаксис 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 
Sanyok писал(а):
Вот ишшо упрощенный вариант (тож прогнал через компилятор):

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

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

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

 
 
 
 
Сообщение08.11.2005, 12:42 
Аватара пользователя
serga писал(а):
Sanyok писал(а):
Вот ишшо упрощенный вариант (тож прогнал через компилятор):

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


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

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


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

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


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

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

 
 
 
 
Сообщение08.11.2005, 13:58 
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 
VLarin писал(а):
и это все, так как если какой-нить элемент матрицы меньше нижней границы, то значит мимимум тоже меньше и, значит, нужно заменять элементы матрицы и считать новую сумму, аналогично с максимумом. Так, что определять минимум и максимум матрицы нет необходимости.
Но я так понимаю, что цель этой работы именно в определении минимума, максимума и суммы матрицы и, если нужен С++, то для этого нужно создать реализацию матрицы, которая бы все это умела:).

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

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

 
 
 [ Сообщений: 18 ]  На страницу 1, 2  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group