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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> удалить из матрицы нулевые строки, помогите доделать! 
V
    Опции темы
AcetoN
Дата 27.5.2007, 01:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Господа уважаемые программеры!
Пожалуйста помогите доделать детскую прогу.

Имеется матрица 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 - кол-во найденых нулевых строк

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

Это сообщение отредактировал(а) AcetoN - 27.5.2007, 01:59
PM MAIL   Вверх
Xenon
Дата 27.5.2007, 02:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Возможно не самое красивое решение, но ... 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;
}





--------------------
user posted image  
PM MAIL   Вверх
AcetoN
Дата 27.5.2007, 03:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо конечно....
но нельзя ли обойтись операторами которые у меня написаны, просто мало того что я сам мало чего тут понимаю, так еще училка или подумает что я шарю круто или что мне делал кто-то другой =)
PM MAIL   Вверх
nerezus
  Дата 27.5.2007, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


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

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



Цитата

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

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

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


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
AcetoN
Дата 27.5.2007, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



я понял, значит мне нужно написать на Си. А вы можете хотя бы сказать где я в моем тексте не прав, там неправильно происходит сдвиг, как мне кажется.
PM MAIL   Вверх
zkv
Дата 27.5.2007, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

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



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

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

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

то тебе бы уже ответили, а так суть помощи сводится к тому, чтобы написать прогу за тебя, а с этим в другой раздел.
PM MAIL   Вверх
AcetoN
Дата 27.5.2007, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ок тогда вот что мне известно:
если ненулевая строчка находится на 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 минут

а есть ФАКи по Си ? я тут вижу в основном один С++
PM MAIL   Вверх
JackYF
Дата 27.5.2007, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



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


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

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

v,q, lmax, l, g



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
AcetoN
Дата 27.5.2007, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



мне обохвать их другими именами ?
если вы писали эту прогу 78 раз, то наверняка знаете как ее дописать, или может кинете ссылку. не думаю что удаление строк из матрицы, это такая сложная тема в порграммировании.
PM MAIL   Вверх
apook
Дата 28.5.2007, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

#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;
}



--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
AcetoN
Дата 28.5.2007, 02:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



apook, у меня зависает или ждет чего-то прога, после вывода исходной матрицы, в общем стопорится и все  smile 
PM MAIL   Вверх
apook
Дата 28.5.2007, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

#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;
}



--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
AcetoN
Дата 30.5.2007, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



а зачем нужен mem.h ?
PM MAIL   Вверх
nerezus
  Дата 30.5.2007, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


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

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



AcetoN, да собственно не нужен, как и conio


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
AcetoN
Дата 30.5.2007, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



conio нужен для очистки экрана

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

Это сообщение отредактировал(а) AcetoN - 30.5.2007, 20:50
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.0644 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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