Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ Матрицы

Автор: Дмитрий 11.12.2007 19:25

Помогите пожалуйста решить задачу:
В задданой матрице удалить методом сдвига столбцы, не содержащие нулей.
К сожалению не имею представления о методе сдвига =(
Заранее благодарен.

Автор: Дмитрий 12.12.2007 16:11

Неужели никто не знает метод сдвига? mega_chok.gif

Автор: volvo 12.12.2007 16:23

Что непонятно? Проверяешь столбец i на наличие нулей... Если есть хоть один ноль - ничего не делать, если ни одного - то просто сдвигаешь все столбцы справа от удаляемого на один влево... Не забудь уменьшить количество столбцов после сдвига...

Автор: Дмитрий 12.12.2007 16:33

Вот есть такое:
Задание удалить из матрицы методом сдвига матрицы содержащие только нечетные элементы. Подскажите где в коде проверяется нечетность, буду под свое модифицировать...

#include <stdio.h>
#include <conio.h>
#define MAX 10

void findrow (int aN, int aM,int *aH,int a[][MAX],int b[MAX]);
void delrow (int aN, int aM,int a[][MAX]);

void main()
{
//int i, j, k, u, N, M, H;
int i, j, N, M, H, *h; //*h-ukazatel' na H
int A[10][10], B[10];
clrscr();
//Uslovie zadachi
printf ( "\n Uslovie postavlennoi zadachi:" );
printf ( "\n Udalit'iz matricy A metodom sdviga");
printf ( "\n stroki, sodergastchie tol'ko nechetnye elementy." );

/*Zapolnenie massiva*/
printf ( "\n \n Vvedite kolichestvo strok i kolonok matricy A," );
printf ( "\n pri uslovii chto kolichesnvo dolgno byt' bol'shie 0 i men'shie 10..." );

do
{
printf ( "\n \n Kolichestvo strok matricy A = " );
scanf ("%d", &N);

if (N<1)
printf ( "\n Nevernoe znachenie! \n Poprobuite snova, uchityvaya chto kolichestvo strok >0." );
else
if (N>10)
printf ( "\n Nevernoe znachenie! \n Poprobuite snova, uchityvaya chto kolichestvo strok <10." );
}
while (N<1 || N>10);

do
{
printf ( "\n Kolichestvo kolonok massiva A = " );
scanf ("%d", &M);

if (M<1)
printf ( "\n Nevernoe znachenie! \n Poprobuite snova, uchityvaya chto kolichestvo kolonok >0." );
else
if (M>10)
printf ( "\n Nevernoe znachenie! \n Poprobuite snova, uchityvaya chto kolichestvo kolonok <10." );
}
while (M<1 || M>10);

printf ("\n Vvod elementov matricy A:\n" );
for (i=0;i<N;i++)
{
printf (" %d stroka:\n",i+1);
for (j=0;j<M;j++)
scanf ("%d", &A[i][j]);
}

clrscr();
//Uslovie zadachi
printf ( "\n Uslovie postavlennoi zadachi:");
printf ( "\n Udalit'iz matricy A metodom sdviga stroki,");
printf ( "\n sodergastchie tol'ko nechetnye elementy.\n");
//Ishodnaya matrica
printf ("\n Ishodnaya matrica: \n");
for (i=0;i<N;i++)
for (j=0;j<M;j++)
{
printf ("%3d",A[i][j]);
if (j==M-1)
printf ("\n");
}

/*Raschetnaya chast*/
H=-1;
h=&H;
// sub (N, M, &H, A, B,1);
// sub (N, M, &H, A, B,2);
findrow (N, M, h, A, B);
delrow (N, M, A);

if (H==-1)
printf ( "\n Iz Matricy A ne udalili ni odnoi stroki.\n" );
else
{
printf ( "\n Iz Matricy A udaliny stroki:\n" );
for (i=0;i<H+1;i++)
printf ("%3d",B[i]);

printf ("\n V rezul'tate imeem Matricy vida: \n");
for (i=0;i<N;i++)
for (j=0;j<M;j++)
{
printf ("%3d",A[i][j]);
if (j==M-1)
printf ("\n");
}

}
printf ("\n Konec resheniya zadachi.");
printf ("\n Dlya vyhoda nazhmite lubuyu klavishu.");
getch();
}

void findrow (int aN, int aM,int *aH,int a[][MAX],int b[MAX])
{
int i, j, k, u;
for (i=0;i<aN;i++)
{
k=0;
for (j=0;j<aM;j++)
if ((a[i][j]%2)==0)
{
break;
}
else
k++;
if (k==aM)
{
*aH++;
b[*aH]=i+1;
}
}
}

void delrow (int aN, int aM,int a[][MAX])
{
int i, j, k, u;

i=0;
do
{
k=0;
for (j=0;j<aM;j++)
if ((a[i][j]%2)==0)
{
i++;
break;
}
else
k++;
if (k==aM)
{
aN=aN-1;
for (u=i;u<aN;u++)
for (j=0;j<aM;j++)
a[u][j]= a[u+1][j];
}
}
while (i<aN);
}

Автор: volvo 12.12.2007 16:40

if ((a[i][j]%2)==0) ...
в функциях findrow и delrow - это и есть проверка элемента на четность...