Здравствуйте, z1z, Вы писали:
z1z>Привет всем...у меня Огромная проблемища....нивкакую не получаются задачки...
z1z>помогите пожалуйста разобраться с тем как решать вот эту задачку:
z1z>С помощью динамических переменных реализуйте вещественную матрицу размером 200 x 100. Каждому элементу матрицы присвойте случайное значение из заданного диапазона. Отсортируйте элементы в строках и строки по значению первого элемента. Выдайте на экран первую подматрицу размером 20 x 10.
Тут 3 слоя: алгоритмы, структуры данных и собственно кодирование.
По алгоритмам:
Лобовое решение — это представить матрицу как массив строк, где каждая строка — указатель на массив.
Отсортировать каждую строку независимо.
Сортировка строк сведётся к сортировке укзателей по хитрому предикату (по первому элементу).
Правда, при этом мы совершим кучу лишней работы...
Следующие улучшения: не полностью сортировать каждую строку и массив строк, а брать первые 20 и первые 10 порядковых статистик, соответственно. Оставшиеся хвосты из 180 элементов и 90 строк сортировать необязательно.
Наконец, ещё более продвинутое решение — это в каждой строке найти первую порядковую статистику (т.е. минимальный элемент), затем отсортировать массив строк, и только затем сортировать каждую из избранных строк.
По структурам данных:
Мне кажется, что если писать на С, то удобнее всего хранить матрицу в линейном массиве построчно. Подмассивы представляют строки.
Отдельно взять массив дескрипторов строк (в самом простом виде — указатели на начала строк в этом линейном массиве).
На С++ можно и массив массивов сделать.
По кодированию:
Если пишешь на C++, то в твоём распоряжении — контейнеры и алгоритмы STL.
Тебе потребуются vector для хранения данных, sort или partial_sort для частичной сортировки. Ну и рукописные функции кое-какие.
Если на Си — то qsort.
Ниже — эскиз кода на С++, изрядно задействующий алгоритмы STL. Это тебе планка для общего развития. Что осилишь — всё твоё
// генератор случайных чисел
struct random
{
double base, delta;
random(double v1, double v2) : base(v1), delta(v2-v1) {}
double operator()() const { return base + delta*rand()/RAND_MAX; }
};
// генератор рядов
struct new_row
{
double* ptr;
int size;
new_row(double* p, int s) : ptr(p), size(s) {}
double* operator()() /*nonconst*/ { double* p = ptr; ptr+=size; return p; }
};
// предикат сортировки строк
struct compare_first_item
{
bool operator()(double const* row1, double const* row2) const { return *row1 < *row2; }
};
// операция частичной сортировки
struct do_partial_sort
{
int count, size; // взять count первых элементов из size
do_partial_sort(int c, int s) : count(c), size(s) {}
void operator()(double* row) const
{
partial_sort(row, row+count, row+size);
}
};
// операция вывода подстроки
struct do_print
{
ostream& ostr;
int count;
do_print(ostream& os, int c) : ostr(os), count(c) {}
void operator()(double const* row) const
{
copy(row, row+count, ostream_iterator<double>(ostr,"; "));
ostr << endl;
}
};
///////////////////////////////////////
// создаём структуры данных
int const X=200, Y=100;
vector<double> data(X*Y);
vector<double*> rows(Y);
generate(rows.begin(), rows.end(), new_row(data.begin(),X)); // заполняем массив строк
// заполняем матрицу мусором
double const vmin=..., vmax=...;
generate(data.begin(), data.end(), random(vmin,vmax));
// сортируем
int const x=20, y=10;
for_each(rows.begin(), rows.end(), do_partial_sort(1,X));
partial_sort(rows.begin(), rows.begin()+y, rows.end());
for_each(rows.begin(), rows.begin()+y, do_partial_sort(x,X));
// выводим
for_each(rows.begin(), rows.begin()+y, do_print(cout,x));
... << RSDN@Home 1.2.0 alpha rev. 655>>