Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > удалить из матрицы нулевые строки


Автор: AcetoN 27.5.2007, 01:57
Господа уважаемые программеры!
Пожалуйста помогите доделать детскую прогу.

Имеется матрица NxM элементов. Нужно удалить методом сдвига все строки, состоящие из нулей.

Вот то что писал сам, может пригодится:
Код

#include <stdio.h>
#include <conio.h>

void main(void)
{

int i,j,l=0,k,q,v,g=0,lmax=0,
    n=4,                                            //kolvo strok
    m=2,                                            //kolvo stolbcov
    a[20][20];                                        //maks dlina massiva

clrscr();                                           //o4istka ekrana
printf("Vvod matrici %dx%d\n",n,m);
for (i=0;i<n;i++) {
    for (j=0;j<m;j++) {
        printf("Vvedite element a[%d][%d]: ",i,j);
        scanf("%d",&a[i][j]);
        }
    }

/* output matrix */
clrscr();
printf("Icxodnaya matrica:\n\n");
for (i=0;i<n;i++) {
    for (j=0;j<m;j++) {
        printf("%3d",a[i][j]);
        if (j==m-1) printf("\n");
        }
    }
/* poisk nylevoi stroki */

for(i=0;i<n;i++) {
    for (j=0;j<m;j++) {
        if (a[i][j]==0) {
       //    printf("%d[%d][%d]=0\n",a[i][j],i,j);
            l++;
            lmax++;
            if (l==m) {
            //printf("nlystrk\n");
                l=0;
                g++;
// ydalenie stroki
                //n--;
                for(v=i;v<n;v++) {
                    printf("v= %d\n",v);
                    for(q=0;q<m;q++) {
                        a[i][q]=a[i+1][q];
                    }
                }

            }
        }// else printf("%d[%d][%d]!=0\n",a[i][j],i,j);

    }

    l=0;
    //printf("\n");
    //printf("i=%d\n",i);
}
printf("naideno nulei: %d",lmax);
printf("\nPoly4ennaya matrica:\n\n");
printf("g= %d\n",g);
for(i=0;i<n;i++) {
    for (j=0;j<m;j++) {
        printf("%3d",a[i][j]);
        if (j==m-1) printf("\n");
        }
    }

printf("\npress any key to continue");
getch();
}


i,j,v,q - переменные для циклов
lmax - считает вбщее кол-во найденых нулей
l - считает нули в текущей строке
g - кол-во найденых нулевых строк

понимаю что вопрос далеко не новый, честно, пробежал по поиску но ничего путного не нашел, извиняйте если что!

Автор: Xenon 27.5.2007, 02:25
Возможно не самое красивое решение, но ... smile
Код

#include <iostream>
#include <algorithm>

const int HEIGHT = 3;
const int WIDTH = 2;

int main(int argc, char* argv[])
{
    int arr[HEIGHT][WIDTH] = { {1,4}, {0,0}, {0,0} };
    int new_height = 0;
    for (int i = 0; i < HEIGHT; ++i)
    {
        for (int j = 0; j < WIDTH; ++j)
        {
            if (arr[i][j]) 
            {
                ++new_height;
                break;
            }
        }
    }
    int** new_arr = new int*[new_height];
    for (int i = 0; i < new_height; ++i) new_arr[i] = new int[WIDTH];
    for (int i = 0, new_i = 0; i < HEIGHT; ++i)
    {
        for (int j = 0; j < WIDTH; ++j)
        {
            if (arr[i][j]) 
            {
                std::copy(&arr[i][0], &arr[i][0] + WIDTH, &new_arr[new_i++][0]);
                break;
            }
        }
    }
    for (int i = 0; i < new_height; ++i)
    {
        for (int j = 0; j < WIDTH; ++j)
            std::cout << new_arr[i][j] << ' ';    
        std::cout << std::endl;
    }
    for (int i = 0; i < new_height; ++i) delete new_arr[i];
    delete [] new_arr;
    std::cin.get();
    return 0;
}



Автор: AcetoN 27.5.2007, 03:12
Спасибо конечно....
но нельзя ли обойтись операторами которые у меня написаны, просто мало того что я сам мало чего тут понимаю, так еще училка или подумает что я шарю круто или что мне делал кто-то другой =)

Автор: nerezus 27.5.2007, 09:32
Цитата

так еще училка или подумает что я шарю круто или что мне делал кто-то другой =)
 Пусть подумает ) Учителя это редко делают )

P.S. за парой исключений, но уважуха этим исключениям.

P.P.S. Ты написал код на C, а Xenon предложил на C++, а вы наверняка изучаете C, поэтому его решение она наверняка назовет неверным(и будет права). Хотя вероятнее всего, что она не знает разницы между C и C++  smile 

Автор: AcetoN 27.5.2007, 15:07
я понял, значит мне нужно написать на Си. А вы можете хотя бы сказать где я в моем тексте не прав, там неправильно происходит сдвиг, как мне кажется.

Автор: zkv 27.5.2007, 15:15
Цитата(AcetoN @  27.5.2007,  15:07 Найти цитируемый пост)
А вы можете хотя бы сказать где я в моем тексте не прав, там неправильно происходит сдвиг, как мне кажется. 

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

умножаю 2 на 2, но 5 никак не получается, в чем дело?

то тебе бы уже ответили, а так суть помощи сводится к тому, чтобы написать прогу за тебя, а с этим в другой раздел.

Автор: AcetoN 27.5.2007, 17:41
ок тогда вот что мне известно:
если ненулевая строчка находится на N+1 (на второй третьей и т.д.) среди нулевых, то сдвиг происходит только один раз, т.е. если имелась матрица
Код

0 0 0 0
0 0 0 0
0 0 0 1
0 0 0 0

получится вот что
Код

0 0 0 0
0 0 0 1
0 0 0 1
0 0 0 0

при условии что конечная матрица выводится полностью (без удаления строк)

блин даж не знаю что можно еще сказать, я думал что для знающих людей такую прогу написать - дело 5 минут

а есть ФАКи по Си ? я тут вижу в основном один С++

Автор: JackYF 27.5.2007, 18:41
Цитата(AcetoN @  27.5.2007,  17:41 Найти цитируемый пост)
такую прогу написать - дело 5 минут


а желания? заново в 79-й раз?..

Добавлено через 6 минут и 5 секунд
Извини, но при всех завершающих комментариях очень нелегко читать код, в котором переменные названы

v,q, lmax, l, g

Автор: AcetoN 27.5.2007, 22:53
мне обохвать их другими именами ?
если вы писали эту прогу 78 раз, то наверняка знаете как ее дописать, или может кинете ссылку. не думаю что удаление строк из матрицы, это такая сложная тема в порграммировании.

Автор: apook 28.5.2007, 00:14
Код

#include <stdio.h>
#include <conio.h>
#include <mem.h>

#define N 4 //kolvo strok
#define M 2 //kolvo stolbcov

void main( void )
{
int i, j, matrix[ N ][ M ], null_count, n=N;

clrscr();
printf( "Vvod matrici %dx%d\n", N, M );
for( i=0; i<N; i++ )
{
    for( j=0; j<M; j++ )
    {
        printf( "Vvedite element matrix[%d][%d]: ", i, j );
        scanf( "%d", &matrix[ i ][ j ] );
        }
    }

/* output matrix */
clrscr();
printf( "Icxodnaya matrica:\n\n" );
for( i=0; i<N; i++ )
{
    for( j=0; j<M; j++ )
        printf( "%3d", matrix[ i ][ j ] );
    printf( "\n" );
    }


/* poisk nylevoi stroki */
for( i=0; i<N; i++ )
{

    for( j=0, null_count=0; j<M; j++ )
    {
        if( matrix[ i ][ j ]!=0 )
            break;
        else
            ++null_count;
        }

    if( null_count==M ) //если нулевая строка
    { 
        memcpy( matrix[ i ], matrix[ i+1 ], sizeof(matrix[ i ]) );
        --n;
        --i;
        }
    }


printf( "naideno nulevih strok: %d", N-n );
printf("\nPoly4ennaya matrica:\n\n");

for( i=0; i<n; i++ )
{
    for( j=0; j<M; j++ )
        printf( "%3d", matrix[ i ][ j ] );
    printf( "\n" );
    }

printf("\npress any key to continue");
getch();
return;
}

Автор: AcetoN 28.5.2007, 02:25
apook, у меня зависает или ждет чего-то прога, после вывода исходной матрицы, в общем стопорится и все  smile 

Автор: apook 28.5.2007, 09:20
Код

#include <stdio.h>
#include <conio.h>
#include <mem.h>

#define N 4 //kolvo strok
#define M 2 //kolvo stolbcov

void main( void )
{
int i, j, c, matrix[ N ][ M ], null_count, n=N;

clrscr();
printf( "Vvod matrici %dx%d\n", N, M );
for( i=0; i<N; i++ )
{
    for( j=0; j<M; j++ )
    {
        printf( "Vvedite element matrix[%d][%d]: ", i, j );
        scanf( "%d", &matrix[ i ][ j ] );
        }
    }

/* output matrix */
clrscr();
printf( "Icxodnaya matrica:\n\n" );
for( i=0; i<N; i++ )
{
    for( j=0; j<M; j++ )
        printf( "%3d", matrix[ i ][ j ] );
    printf( "\n" );
    }


/* poisk nylevoi stroki */
for( i=0; i<N;  )
{


    for( j=0, null_count=0; j<M; j++ )
    {
        if( matrix[ i ][ j ]!=0 )
            break;
        else
            ++null_count;
        }

    if( null_count==M ) //если нулевая строка
    { 
        for( j=i; j<N; j++ )
        {
            for( c=0; c<M; c++ )
                matrix[ j ][ c ]=matrix[ j+1 ][ c ]; 
            }
        --n;
        }
    else
        ++i;

    }

printf( "naideno nulevih strok: %d", N-n );
printf("\nPoly4ennaya matrica:\n\n");

for( i=0; i<n; i++ )
{
    for( j=0; j<M; j++ )
        printf( "%3d", matrix[ i ][ j ] );
    printf( "\n" );
    }

printf("\npress any key to continue");
getch();
return;
}

Автор: AcetoN 30.5.2007, 13:47
а зачем нужен mem.h ?

Автор: nerezus 30.5.2007, 16:49
AcetoN, да собственно не нужен, как и conio

Автор: AcetoN 30.5.2007, 20:49
conio нужен для очистки экрана

вроде работает, спасибо всем кто помогал и отдельное спасибо тому кто помог, жаль не могу репутацию тебе поднять т.к. постов мало  smile 

Автор: Dov 1.6.2007, 02:54
Цитата(AcetoN @  30.5.2007,  20:49 Найти цитируемый пост)
жаль не могу репутацию тебе поднять

Не вопрос. Поможем.  smile

Добавлено через 5 минут и 20 секунд
Во, блин, не даёт плюсануть. Нужно подождать один день.  smile 

Автор: JackYF 1.6.2007, 14:20
Цитата(Dov @  1.6.2007,  02:54 Найти цитируемый пост)
Во, блин, не даёт плюсануть. Нужно подождать один день.  smile  


Э? А что может не давать плюсануть? Сообщений у тебя много.

Автор: Dov 1.6.2007, 14:30
Цитата(JackYF @  1.6.2007,  14:20 Найти цитируемый пост)
Э? А что может не давать плюсануть? Сообщений у тебя много.

JackYF, я так понимаю, что 2 раза втечение 24 часов плюсовать одного человека низзя.  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)