Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Многомерный массив, Удаление строки. 
:(
    Опции темы
bsa
Дата 6.5.2006, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Код

#include <stdio.h>
#include <malloc.h>
#include <string.h>

int * input_matrix(void);
void print_matrix(const int * matrix);
int * delete_row(const int * matrix, int r);
int get_low_row(const int * matrix);

int main() {
    int *src, *dst;
    src = input_matrix();
    if ( src != NULL ) {
        printf("Input matrix is\n");
        print_matrix( src );
        dst = delete_row( src, get_low_row( src ) );
        if ( dst != NULL ) {
            print_matrix( dst );
            free( dst );
        }
        free( src );
    }
    return 0;
}

int * input_matrix(void) {
    int m, n, i, j;
    int * matrix;
    do {
        printf("Input matrix width:\n");
        scanf("%d", &m);
        if ( m <= 0 )
            fprintf(stderr, "Invalid value\n");
    } while( m <= 0 );
    do {
        printf("Input matrix height:\n");
        scanf("%d", &n);
        if ( n <= 0 )
            fprintf(stderr, "Invalid value\n");
    } while( n <= 0 );
    matrix = (int*)malloc( (m * n + 2) * sizeof(*matrix) );
    matrix[0] = m;
    matrix[1] = n;
    for( i = 0; i < n; ++i ) {
        int * p = matrix + ( m * i + 2 );
        for( j = 0; j < m; ++j, ++p ) {
            printf("Input M[%d;%d]:\n", i, j);
            scanf("%d", p);
        }
    }
    return matrix;
}

void print_matrix(const int * matrix ) {
    int i,j, m, n;
    if ( matrix != NULL ) {
        m = matrix[0];
        n = matrix[1];
        matrix += 2;
        for( i = 0; i < n; ++i ) {
            for( j = 0; j < m; ++j, ++matrix )
                printf( "%d ", *matrix );
            printf("\n");
        }
    }
}

int get_low_row(const int * matrix) {
    int m,n,i,j,k,t;
    if ( matrix != NULL ) {
        m = matrix[0];
        n = matrix[1];
        matrix += 2;
        k = 0;
        t = *matrix;
        for( i = 0; i < n; ++i ) {
            const int * p = matrix + i * m;
            for( j = 0; j < m; ++j, ++p ) {
                if ( *p < t ) {
                    t = *p;
                    k = i;
                }
            }
        }
    }
    return k;
}

int * delete_row(const int * matrix, int r) {
    int * result = NULL;
    if ( matrix != NULL ) {
        result = (int*)malloc( matrix[0] * ( matrix[1] - 1 ) * sizeof( *matrix ) + 2 );
        result[0] = matrix[0];
        result[1] = matrix[1] - 1;
        if ( r > 0 )
            memcpy( result + 2, matrix + 2, r * matrix[0] * sizeof(*matrix) );
        memcpy(result + 2 + r * matrix[0], matrix + 2 + (r + 1) * matrix[0], (matrix[1] - r - 1) * matrix[0] * sizeof(*matrix) );
        
    }
    return result;
}

 
PM   Вверх
Josh
Дата 6.5.2006, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 6.5.2006

Репутация: нет
Всего: нет



У меня похожая задачка. Транспонировать матрицу надо... 

Это сообщение отредактировал(а) Josh - 6.5.2006, 18:36
PM MAIL   Вверх
MAKCim
Дата 6.5.2006, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

У меня похожая задачка. Транспонировать матрицу надо... 

где связь между ними? 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
bsa
Дата 6.5.2006, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Josh, решение - проще некуда! Даже пример приводить не хочу! 
PM   Вверх
Rockie
Дата 6.5.2006, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Josh, транспонирование матриц
Код
#include <conio.h>
#include <stdio.h>
#include <iostream.h>

int main() {
int **mas;                 // array
int **t_mas;               // transposed array
int rows = 0, cols = 0;
cout<<"rows: "; cin>>rows;
cout<<"cols: "; cin>>cols;

mas = new int * [rows];    // memory for array
for(int i = 0; i < rows; i++)
 { mas[i] = new int[cols];
 }

t_mas = new int * [cols];  // memory for transposed array
for(int i = 0; i < cols; i++)
 { t_mas[i] = new int[rows];
 }

for(int i = 0; i < rows; i++) // filling array with 10
 {  for(int j = 0; j < cols; j++)
   { mas[i][j] = 10;
   }
 }

cout<<'\n';

for(int i = 0; i < rows; i++) // display array
 { for(int j = 0; j < cols; j++)
   { cout<<mas[i][j]<<' ';
   }
   cout<<'\n';
 }

for(int i = 0; i < cols; i++) // transposing array
 {  for(int j = 0; j < rows; j++)
   { t_mas[i][j] = mas[j][i];
   }
 }

cout<<'\n';

for(int i = 0; i < cols; i++) // display array
 { for(int j = 0; j < rows; j++)
   { cout<<t_mas[i][j]<<' ';
   }
   cout<<'\n';
 }

getch();
return 0;
}
 


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Josh
Дата 24.8.2006, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 6.5.2006

Репутация: нет
Всего: нет



Сейчас вот разбираюсь с программкой bsa и вот эти три момента никак не могу понять:

[/quote]
Код

 m = matrix[0];
        n = matrix[1];
        matrix += 2;
        k = 0;
        t = *matrix;


Код

result = (int*)malloc( matrix[0] * ( matrix[1] - 1 ) * sizeof( *matrix ) + 2 );
        result[0] = matrix[0];
        result[1] = matrix[1] - 1;


Код

 memcpy( result + 2, matrix + 2, r * matrix[0] * sizeof(*matrix) );
        memcpy(result + 2 + r * matrix[0], matrix + 2 + (r + 1) * matrix[0], (matrix[1] - r - 1) * matrix[0] * sizeof(*matrix) );


кому не трудно, разьясните что к чему. Буду очень благодарен
PM MAIL   Вверх
MAKCim
Дата 24.8.2006, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

Помогите пожалуйста... Хоть через динамические хоть как-нибудь

Код

typedef int int_t;

int_t* create_matrix(size_t rows, size_t colums)
    { return malloc(rows*colums*sizeof(int_t)); }

void destroy_matrix(int_t* ptr)
    { if (ptr!=NULL) free(ptr); }

int_t get(size_t i, size_t j, size_t colums, int_t* matrix)
    { return matrix[i*colums+j]; }

void set(size_t i, size_t j, size_t colums, int_t* matrix, int_t elem)
    { matrix[i*colums+j]=elem; }

size_t find(int_t* matrix, size_t rows, size_t colums)
{
    size_t i, j, k;
    int_t value=get(0,0,colums,matrix), p;
    for (i=0; i<rows; ++i)
        for (j=0; j<colums; ++j)
            if ((p=get(i,j,colums,matrix))<value) k=i, value=p;
    return k;
}

void delete_element(int_t** matr_ptr, size_t rows, size_t colums)
{
    int_t* matrix=create_matrix(rows-1,colums);
    size_t deleted=find(*matr_ptr,rows,colums), i=0, j, k;
    for (; i<rows; ++i)
    {
        if (i<deleted) k=i;
        else if (i>deleted) k=i-1;
        else continue;
        for (j=0; j<colums; ++j) set(k,j,colums,matrix,get(i,j,colums,*matr_ptr));
    }
    destroy_matrix(*matr_ptr);
    *matr_ptr=matrix;
}



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Josh
Дата 25.8.2006, 05:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 6.5.2006

Репутация: нет
Всего: нет



Повторю свой последний топик...
PM MAIL   Вверх
Oleg_Ci
Дата 25.8.2006, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 3
Всего: 30



Цитата(Josh @  24.8.2006,  22:23 Найти цитируемый пост)
Сейчас вот разбираюсь с программкой bsa и вот эти три момента никак не могу понять:
Код

m = matrix[0];  // ширина матрицы
n = matrix[1];   // высота матрицы
matrix += 2;     // перемещаем указатель на начало данных
k = 0;               // номер строки где содержится минимальный элемент (число)
t = *matrix;       // в 't' теперь первое число из матрицы ( верхнее левое число в квадратной матрице 'matrix[0][0]' )
Код

result = (int*)malloc( matrix[0] * ( matrix[1] - 1 ) * sizeof( *matrix ) + 2 );
result[0] = matrix[0];        // ширина
result[1] = matrix[1] - 1;  // высота "без одной строки"
По русски как-то так прочитать можно:
выделяем память (под масив) такой-то ширины (matrix[0]) такой-то высоты (matrix[1] - 1), для того чтоб скопировать первоначальный массив туда, но без одной строки, поэтому на одну строку меньше. Умножение ширины на высоту и на "разменость" smile  ( количество байт под число ) (sizeof( *matrix ))  - даёт необходимый размер памяти, прибавлям 2, для двух чисел - ширина и высота.
Код

memcpy( result + 2, matrix + 2, r * matrix[0] * sizeof(*matrix) );//до удаляемой строки
memcpy(result + 2 + r * matrix[0], matrix + 2 + (r + 1) * matrix[0], (matrix[1] - r - 1) * matrix[0] * sizeof(*matrix) );// после удаляемой строки до конца
Здесь два раза копируем память. Результат должен-быть без одной строки, поэтому первый раз копируем строки от первой до той которую надо удалить, а второй раз копируем от удаляемой до последней. Тоесть копируем массив, но не весь, без одной строки.


PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0561 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.